0

我创建了一个带有表单的 dll,当我们注入 dll 时,表单打开。但是当我这样做时,问题是我注入的过程,卡住了,我无法让他注意到。

这就是我所做的。

DWORD WINAPI MessageLoop(HINSTANCE hInstance)
{
    hWindow = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DLGPROC(WindowProc));

    MSG Msg;
    while(GetMessage(&Msg, 0, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return 0;
}

和注射:

DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MessageLoop(hInstance), 0, 0, 0);
    }

    return 0;
}

@雷米勒博:

DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);
    }

    return 0;
}
4

1 回答 1

4

你的电话CreateThread()是错误的。您没有将地址传递MessageLoop()给它,而是实际上是在调用它MessageLoop()。尝试这个:

DWORD WINAPI MessageLoop(LPVOID lpParameter)
{
    HINSTANCE hInstance = (HINSTANCE) lpParameter;
    ...
}

CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);

顺便说一句,CreateThread()打电话不安全DllMain()。这在各种 MSDN 文档中都有明确说明。您必须将其移出DllMain(),例如让 DLL 导出一个在CreateThread()内部调用的单独函数,然后让您的注入代码在 DLL 加载到内存后调用导出的函数。

于 2012-12-29T19:29:15.527 回答