c ++ dll бесконечный l oop без использования потока - PullRequest
1 голос
/ 29 апреля 2020

возможно ли использовать бесконечное l oop в функции 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?

1 Ответ

1 голос
/ 29 апреля 2020

Первая проблема

Это неопределенное поведение:

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 для начала. И, согласно Раймонду, вам определенно не следует создавать поток .

...