是否可以在一个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?
第一个问题
这是未定义的行为。
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的说法。你绝对不应该创建一个线程.