Delphi 将消息传递到DLL';s入口点

Delphi 将消息传递到DLL';s入口点,delphi,dll,delphi-xe,Delphi,Dll,Delphi Xe,我有一个DLL,它在其入口点执行一些代码,即 procedure MainDLL(Reason: Integer); begin { ... Code here ... } end; begin DLLProc := @MainDLL; end. 现在,我想从外部应用程序向DLL的入口点传递一些值。我尝试在DLL中创建一个隐藏窗口,如下所示: const WM_JAJCO = WM_USER + 1024; type TWnd = class(TObject) cl

我有一个DLL,它在其入口点执行一些代码,即

procedure MainDLL(Reason: Integer);
begin
  { ... Code here ... }
end;

begin
  DLLProc := @MainDLL;
end.
现在,我想从外部应用程序向DLL的入口点传递一些值。我尝试在DLL中创建一个隐藏窗口,如下所示:

const
  WM_JAJCO = WM_USER + 1024;

type
  TWnd = class(TObject)
    class procedure DLLWndProc(var Msg: TMessage);
  end;

{ ... }

class procedure TWnd.DLLWndProc(var Msg: TMessage);
var
  Tmp: DWORD;
begin
  if (Msg.Msg = WM_JAJCO) then
  begin
    PNewHandle := Msg.LParam;
    CreateThread(nil, 0, @Starter, nil, 0, Tmp);

    Msg.Result := 0;
  end else
    Msg.Result := DefWindowProc(MyHnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;

// in the entry point
MyHnd := AllocateHWND(TWnd.DLLWndProc);
然后,在调用方应用程序中初始化DLL后,我使用:

SendMessage(FindWindow('TPUtilWindow', nil), WM_USER + 1024, 0, wi.WndHandle);
Application.ProcessMessages();
但是在DLL中创建的窗口似乎没有收到消息。你知道为什么吗


如果这是一个糟糕的方法,而您有不同的解决方案,请告诉我。

这是一个相当曲折的方法。您应该尽可能少地使用DllMain函数。规范的解决方案是创建一个专用函数来执行初始化。安排主机应用程序在调用任何其他功能之前调用初始化功能

您的版本失败的最可能原因是有许多窗口使用该类名。AllocHwnd创建的每个窗口都有该类名。FindWindow可能只是找到了错误的一个


另一方面,您在传递注释时提到此DLL已被注入!在这种情况下,您可以通过使用唯一的类名或为窗口指定唯一的标题使方法工作,以便您可以找到它


最后,对ProcessMessages的调用看起来是免费的。

这是一种相当曲折的方法。您应该尽可能少地使用DllMain函数。规范的解决方案是创建一个专用函数来执行初始化。安排主机应用程序在调用任何其他功能之前调用初始化功能

您的版本失败的最可能原因是有许多窗口使用该类名。AllocHwnd创建的每个窗口都有该类名。FindWindow可能只是找到了错误的一个


另一方面,您在传递注释时提到此DLL已被注入!在这种情况下,您可以通过使用唯一的类名或为窗口指定唯一的标题使方法工作,以便您可以找到它


最后,对ProcessMessages的调用看起来是免费的。

您不应该为此使用DLLMain。只需导出您自己的init函数并手动调用它。

您不应该为此使用DLLMain。只需导出自己的init函数并手动调用它。

首先确保注入的DLL确实创建了窗口句柄。WinSight或Spy++应该可以帮助您实现这一点。一旦知道窗口确实存在,请确保FindWindow找到您的窗口句柄,而不是另一个具有相同类名的窗口句柄。IIRC,甚至Delphi IDE本身也使用这个类名创建窗口句柄。

首先确保注入的DLL确实创建了窗口句柄。WinSight或Spy++应该可以帮助您实现这一点。一旦知道窗口确实存在,请确保FindWindow找到您的窗口句柄,而不是另一个具有相同类名的窗口句柄。IIRC,甚至Delphi IDE本身也使用这个类名创建窗口句柄。

为什么不从DLL中导出一个函数,并通过
GetModuleHandle
GetProcAddress
和对获取的指针的调用将参数传递给这个导出的函数呢?但是一旦我调用了
LoadLibrary
,入口点就会被执行,不是吗?我不明白你的意思。你为什么不从DLL中导出一个函数,并通过
GetModuleHandle
GetProcAddress
和对获取的指针的调用将参数传递给这个导出的函数呢?但是一旦我调用
LoadLibrary
,入口点就会执行,不是吗?我不明白你的意思。问题是DLL被注入到另一个进程中,我不知道一旦它被注入到进程中,如何调用该DLL的导出函数。有趣的是,当我在DLL中创建窗口并从DLL向其发送消息时,它接收到它,但当我调用FindWindow()时从注入的可执行文件中,它找不到窗口。问题是DLL被注入到另一个进程中,而我不知道在该DLL被注入进程后如何调用该DLL的导出函数。有趣的是,当我在DLL中创建窗口并从DLL向其发送消息时,它接收到它,但是当我从注入可执行文件调用FindWindow()时,它找不到窗口。你是对的,但问题出在其他地方。请查看我对David Heffernan答案的最新评论。你是对的,但问题出在其他地方。请查看我对David Heffernan回答的最新评论。