MessageBox vs Delphi

naska79

Очень забавная вещь. Есть multithreaded application на С++. Юзает dll на Делпхи. Если внутри dll встречается Windows.MessageBox тихо и грациозно вылетает. Причем не exception какой-то, просто такое впечатление, что нитка завершается, да и все приложение потом имеет бледный вид.
Что самое смешное - MessageBoxEx срабатывает нормально. Внимание, вопрос:
WHY ?!

vijrel7878

смею предположить, что проблема кроется в несовместимости представленни строк. MessageBox по умолчанию юзает апишную ф-ю MessageBoxA , может ты ей туда что-то другое кормишь?

naska79

Не, тут дело не в этом. И MessageBox, и MessageBoxEx
принимают указатели на char, что я и передаю и тому и тому. И копать я начал потому, что диалог, который нормально показывается в обычном приложении, все рушит в описанной ситуации (dll в нитке). Делпхи вообще очень трепетно относится к ейным message box'ам в multithreaded приложениях.
Но я не понимаю, какое Делпхи дело до прямых API - шных вызовов виндов. И совсем не понимаю, почему реакция на MessageBox отличается от реакции на MessageBoxEx.
Впрочем, это проблема потенциальная. Диалогов там по идее быть не должно, но юзается большой кусок чужого кода, и то, встреча появление в нем модального диалога практически кладет все приложение - мне активно не нравится.

vijrel7878

а че ту странного, в виндовс и delphi багов дохера

naska79

У меня нет Делпхи под рукой.
А не одна фигня, или PChar - указатель на двух-байтовые символы что-ли?
Кроме того, я писал константы вроде 'danya', поэтому они должны были привестись правильно по-любому или ругнуться.
+ слишком большой катаклизм для чтения даже за пределы массива, тут уместно ожидать что-то вроде Access Violation.
+ в нормальном приложении этот код работает.
Черт, или у меня глюки, или ты подредактировал! Помечай хоть :-)
Баги багами, но порой их можно обмануть. Сделать финт ушами - глядишь, и заработало... Способ _заставить_ прогу работать я и хочу получить.

vijrel7878

PAnsiChar и Pchar в принципе одно и то же, кроме одного момента: способа выделения памяти. Для анси строк - динамический, для short string - статический. MessageBox использует PAnsiChar, соответственно память выделяется в программе, освобождается в dll как результат - все падает, так как менеджер памяти для каждого модуля свой.
С Pchar`ом - MessageBoxEx все прокатывает.

naska79

Теоретически можно такое представить, но тут не тот случай.
Оставить комментарий
Имя или ник:
Комментарий: