Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个C程序无限循环?_C_Winapi_Dll - Fatal编程技术网

为什么这个C程序无限循环?

为什么这个C程序无限循环?,c,winapi,dll,C,Winapi,Dll,我编写了一个DLL文件,可以将其注入另一个进程。一旦注入,它应该创建一个消息框。它似乎创建了无限多的MessageBox,我的电脑崩溃了。有什么想法吗?另外,DLLIMPORT和DWORD WINAPI之间有什么区别?主管道是DLLIMPORT还是其他管道 dllmain.c /* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> DLLIMPORT void

我编写了一个DLL文件,可以将其注入另一个进程。一旦注入,它应该创建一个消息框。它似乎创建了无限多的MessageBox,我的电脑崩溃了。有什么想法吗?另外,DLLIMPORT和DWORD WINAPI之间有什么区别?主管道是DLLIMPORT还是其他管道

dllmain.c

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>

DLLIMPORT void HelloWorld() {
    MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
}

int main() {
    MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
}

DWORD WINAPI Main(LPVOID lpParam) {
    main();
    return S_OK;
}

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch(fdwReason) {
        case DLL_PROCESS_ATTACH:
        break;

        case DLL_PROCESS_DETACH:
        break;

        case DLL_THREAD_ATTACH:
        DisableThreadLibraryCalls(hinstDLL);
        CreateThread(NULL, 0, &Main, NULL, 0, NULL);
        break;

        case DLL_THREAD_DETACH:
        break;
    }

    return TRUE;
}

当DLL附加到进程而不是线程时执行线程:

...
        case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hinstDLL);
        CreateThread(NULL, 0, Main, NULL, 0, NULL);
        break;

        case DLL_PROCESS_DETACH:
        break;

        case DLL_THREAD_ATTACH:
        break;

        case DLL_THREAD_DETACH:
        break;
...

然后检查传递给
CreateThread
的回调,它应该是
Main
而不是
&Main
,它已经是指针。

可能DLL\u THREAD\u ATTACH中的CreateThread()会导致另一个线程附加事件,该事件调用DllMain(),从而启动递归。那只是我的猜测。我对纯Win32不太了解。@BSH:为什么Main已经是指针了?如果我理解正确的话,Main是一个双字。因此,它是一个无符号整数。@user2899050
Main
是指向函数的指针、地址,因此这里不需要使用
&Main
。我真的不知道DWORD是从哪里来的,但是
Main
不是
DWORD
,它是一个函数指针。如果你提到大小,地址是32位,
DWORD
是32位类型,但在64位系统上不是这样,
DWORD
是32位,
Main
地址是64位。我相信在获取函数地址时,Main和&Main是等价的。其他任何东西的地址都是另一回事。
...
        case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hinstDLL);
        CreateThread(NULL, 0, Main, NULL, 0, NULL);
        break;

        case DLL_PROCESS_DETACH:
        break;

        case DLL_THREAD_ATTACH:
        break;

        case DLL_THREAD_DETACH:
        break;
...