我有在 Delphi 7 上编写的 Windows 窗体应用程序和使用 MFC 编写的 C++ .dll。
目前我正在尝试实现从 .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;
来自可执行文件的 C++ 函数调用:
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 捕获任何事件。
所以,有两个问题:1.为什么hWnd值总是不同的,为什么它们“未使用”?2.如何强制我的主应用程序与进度条一起正常工作?
我一直在使用不同的方法来解决这个问题。例如将Application.Handle或Form1.Handle作为函数参数传递给 C++ 库。他们都没有工作,甚至没有说参数值在传递时发生了变化(我想这应该是一个单独的问题)。我还尝试使用::FindWindow()和::PostMessage()而不是FindWindow()和PostMessage()(它们之间有什么区别?),这也没有帮助。我已经在尝试改善一整天的情况,但不知道如何解决。请帮助我任何想法。