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

问题描述 投票:0回答:1

是否可以在一个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_PROCESS_ATTACH?

c++ multithreading for-loop dll dllmain
1个回答
1
投票

第一个问题

这是未定义的行为。

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_PROCESS_ATTACH中做任何有意义的事情。 而根据Raymond的说法。你绝对不应该创建一个线程.

© www.soinside.com 2019 - 2024. All rights reserved.