Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++;不使用线程的dll无限循环_C++_Multithreading_For Loop_Dll_Dllmain - Fatal编程技术网

C++ c++;不使用线程的dll无限循环

C++ c++;不使用线程的dll无限循环,c++,multithreading,for-loop,dll,dllmain,C++,Multithreading,For Loop,Dll,Dllmain,是否可以在不使用线程的情况下在dll函数中使用无限循环 下面是一些示例代码: BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hModule); GetModuleHandleExA(GET_MODUL

是否可以在不使用线程的情况下在dll函数中使用无限循环

下面是一些示例代码:

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, (LPCSTR)hModule, &hModule);
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myfunction, 0, NULL, 0); //my current method
        myfunction(); //locks the program at runtime if i do it this way (just an example)
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
下面是线程中函数的一个示例:

void myfunction() {
    //begin the infinite loop after 5 seconds
    Sleep(5000);
    for (;;) //set no condition for breaking the loop
    {
        Sleep(500); //this keeps the cpu from spiking
        //call my functions
        function1();
        function2();
        function3();
        function4();
    }
}

这段代码运行良好。我只是想知道是否有其他选择。例如:可以将函数写入进程的内存中吗?或者在以后调用,而不是DLL_进程_附加?

第一期

这是未定义的行为:

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myfunction, 0, NULL, 0);
您正在强制转换
myFunction
的函数签名这一事实可能会损坏堆栈

将myFunction的签名更改如下:

DWORD __stdcall myfunction(void*) {
当您可以从CreateThread中删除可疑的强制转换时,您知道您做对了:

CreateThread(NULL, 0, myfunction, 0, NULL, 0);
第二期


首先,您不应该在DLL\u进程\u ATTACH中做任何有意义的事情。根据雷蒙德的说法,.

这能回答你的问题吗?如果您正在从远程进程中注入此DLL,请考虑使用以绕过此限制。如果进程是自愿加载DLL,则让它在DLL中调用某种类型的
init
函数。我会研究你的建议。如果你真的仔细阅读了Raymond所说的,并且在
DllMain
中调用
CreateThread
,只要你不在新线程上同步就可以了。不建议创建线程,但也不禁止创建线程。只要把线踢开,继续前进就可以了。