У меня есть приложение Windows Forms, написанное на Delphi 7 и C++.dll, написанное с использованием MFC.
В настоящее время я пытаюсь реализовать базовую публикацию сообщений из .dll в основной исполняемый файл, чтобы показать процесс расчета пользователя на индикаторе выполнения, но столкнулся с несколькими проблемами.
Позвольте мне сначала описать мой подход. Я регистрирую простое сообщение в своем приложении Delphi, например:
WM_MSG := RegisterWindowMessage('WM_MSG');
и сделайте то же самое в библиотечной части:
UINT nMsgID = RegisterWindowMessage(_T("WM_MSG"));
Это нормально: при отладке я вижу одинаковые значения с обеих сторон.
Моя библиотечная функция выглядит так (просто фиктивный пример для проверки индикатора выполнения):
extern "C" __declspec(dllexport) int MyFunction() {
UINT nMsgID = RegisterWindowMessage(_T("WM_MSG"));
HWND hWnd = FindWindow(NULL, "Form1");
if (hWnd > 0)
for (int i = 0; i < 100000; i++) {
int param = ceil(100 * (double) i / (double) 100000);
PostMessage(hWnd, nMsgID, param, NULL);
}
return 1;
}
Исполняемое событие OnMessage:
procedure TForm1.OnMessageEvent(var Msg: tagMSG; var Handled: Boolean);
begin
Handled := True;
if Msg.message = WM_MSG then
ProgressBar1.Position := Msg.wParam
else Handled := False;
end;
Вызов функции С++ из исполняемого файла:
procedure TMyFunctionDLL.Execute;
var
i: Integer;
tHWND: HWND;
begin
tHWND := FindWindow(nil, 'mainF');
i := Func;
end;
Первая проблема заключается в том, что значения переменных tHWND и hWnd необъяснимо отличаются. После некоторых исследований я обнаружил 3 ситуации: 1. Отрицательный или положительный огромный hWnd 2. Нулевой hWnd 3. Неопределенный ('???')
Во всех случаях переменная hWnd помечается как неиспользуемая, и я не знаю, что это значит. Самое интересное, что код РАБОТАЕТ, если я тестирую его в очень простой форме Delphi (только с одним модулем). Эта простая форма Delphi хорошо работает с моим реальным кодом C++ .dll, где вычисляются реальные данные. Но когда я использую свое обычное приложение Delphi (много модулей, но все же одну форму), кажется, что событие OnMessage основного приложения не перехватывает какие-либо события из C++ dll.
Итак, есть 2 вопроса: 1. почему значения hWnd всегда разные и почему они "не используются"? 2. как я могу заставить мое основное приложение правильно работать с индикатором прогресса?
Я использовал разные подходы для решения этой проблемы. Например, передача Application.Handle или Form1.Handle в качестве параметра функции в библиотеку C++. Ни один из них не работал, даже не говоря об изменении значения параметра при передаче (я думаю, это должен быть отдельный вопрос). Также я пробовал использовать ::FindWindow() и ::PostMessage() вместо FindWindow() и PostMessage(). (в чем между ними разница?), это тоже не помогло. Я пытаюсь улучшить ситуацию уже целый день, но понятия не имею, как это решить. Помогите мне с любыми идеями, пожалуйста.