DWORD WINAPI NewThreadProc(LPVOID params)
{
long aa=0;
while (aa!=499999999){ //占用一定的CPU时间来运行线程
aa=aa+1;
}
return 0;
}DWORD WINAPI ThreadProc(LPVOID params)
{
DWORD p;
HANDLE gThread; gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, NULL,0 ,&p);
WaitForSingleObject(gThread,INFINITE); //但这里却返回0(成功),用户界面也有响应
CloseHandle(gThread);return 0;
}DWORD WINAPI StartThread(){ DWORD p;
HANDLE hThread; hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadProc,NULL,0,&p);
//WaitForSingleObject(hThread,INFINITE); //不知道为什么这里总是返回WAIT_TIMEOUT,而且如果用了这个函数,用户界面就无响应了
CloseHandle(hThread);
return 0;
}extern "C"
BOOL WINAPI DllMain( HANDLE hModule,
DWORD reason,
LPVOID lpReserved
)
{switch (reason)
{
case DLL_PROCESS_ATTACH:
{
StartThread();
return true;}
case DLL_PROCESS_DETACH:
{
return true;
}
default:
return true;
}}这个是我要写的一个dll,我需要在dll初始化的DLL_PROCESS_ATTACH中就开启线程而且这个dll在动态调用后而且执行完DLL_PROCESS_ATTACH就要马上用FreeLibrary在宿主进程中卸载,但卸载dll时宿主进程就自动出现错误报告,然后退出了,我找到原因是运行FreeLibrary时NewThreadProc仍然在执行,这时出错了但我想要在NewThreadProc完成后再FreeLibrary,有什么办法吗??????
还有StartThread函数里面用CreateThread创建线程,如果用WaitForSingleObject,根本就无响应而且无法创建线程ThreadProc,但如果StartThread里不用WaitForSingleObject,再创建一个线程ThreadProc,这里的WaitForSingleObject又可以响应了不过那时就出现了上面的问题了……各位牛人,刚学VC,可能语法有错误,希望能帮助一下,谢谢了!!!!!!!!
{
long aa=0;
while (aa!=499999999){ //占用一定的CPU时间来运行线程
aa=aa+1;
}
return 0;
}DWORD WINAPI ThreadProc(LPVOID params)
{
DWORD p;
HANDLE gThread; gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, NULL,0 ,&p);
WaitForSingleObject(gThread,INFINITE); //但这里却返回0(成功),用户界面也有响应
CloseHandle(gThread);return 0;
}DWORD WINAPI StartThread(){ DWORD p;
HANDLE hThread; hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadProc,NULL,0,&p);
//WaitForSingleObject(hThread,INFINITE); //不知道为什么这里总是返回WAIT_TIMEOUT,而且如果用了这个函数,用户界面就无响应了
CloseHandle(hThread);
return 0;
}extern "C"
BOOL WINAPI DllMain( HANDLE hModule,
DWORD reason,
LPVOID lpReserved
)
{switch (reason)
{
case DLL_PROCESS_ATTACH:
{
StartThread();
return true;}
case DLL_PROCESS_DETACH:
{
return true;
}
default:
return true;
}}这个是我要写的一个dll,我需要在dll初始化的DLL_PROCESS_ATTACH中就开启线程而且这个dll在动态调用后而且执行完DLL_PROCESS_ATTACH就要马上用FreeLibrary在宿主进程中卸载,但卸载dll时宿主进程就自动出现错误报告,然后退出了,我找到原因是运行FreeLibrary时NewThreadProc仍然在执行,这时出错了但我想要在NewThreadProc完成后再FreeLibrary,有什么办法吗??????
还有StartThread函数里面用CreateThread创建线程,如果用WaitForSingleObject,根本就无响应而且无法创建线程ThreadProc,但如果StartThread里不用WaitForSingleObject,再创建一个线程ThreadProc,这里的WaitForSingleObject又可以响应了不过那时就出现了上面的问题了……各位牛人,刚学VC,可能语法有错误,希望能帮助一下,谢谢了!!!!!!!!
解决方案 »
- DirectUI 3D界面引擎 -- demo源码
- 求获取电脑上各种硬件物理编号的代码或方法,头痛好久的问题,实在没有分可用了,问题又比较急,请大家原谅下。
- c++嵌入c代码问题
- 求救;数据恢复工具
- vc的split函数怎么用?
- 程序创建一个新的文档时,InitialUpdateFrame是不是引起ondraw()的执行?
- Access 中的自动编号问题??
- 谁能给我讲解一下PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
- PE的一个问题,不懂的别进来聒噪!!!
- 如何实现flexgrid的打印,(100分)
- 刚接触网络编程,求文件传输的最简单的例子,谢谢大家!
- 请教文件的包含的区别
//For example :
BOOL IsThreadTerminate=FALSE;//Then modify your source code
DWORD WINAPI NewThreadProc(LPVOID params)
{
BOOL bTerminate=(BOOL)(* params);
long aa=0;
while ((aa<499999999)&&bTerminate)
{ //占用一定的CPU时间来运行线程
aa=aa+1;
}
return 0;
}DWORD WINAPI ThreadProc(LPVOID params)
{
DWORD p;
HANDLE gThread;gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, ¶ms,0 ,&p);
WaitForSingleObject(gThread,INFINITE);//但这里却返回0(成功),用户界面也有响应
CloseHandle(gThread);return 0;
}DWORD WINAPI StartThread(){ DWORD p;
HANDLE hThread;hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadProc,& IsThreadTerminate,0,&p);
//WaitForSingleObject(hThread,INFINITE); //不知道为什么这里总是返回WAIT_TIMEOUT,而且如果用了这个函数,用户界面就无响应了
CloseHandle(hThread);
return 0;
}extern "C"
BOOL WINAPI DllMain( HANDLE hModule,
DWORD reason,
LPVOID lpReserved
)
{switch (reason)
{
case DLL_PROCESS_ATTACH:
{
StartThread();
return true;}
case DLL_PROCESS_DETACH:
{
IsThreadTerminate =TRUE;
Sleep(20);
return true;
}
default:
return true;
}}
// ¶ms -> params
DWORD WINAPI ThreadProc(LPVOID params)
{
DWORD p;
HANDLE gThread;gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, params,0 ,&p);
將while ((aa<499999999)&&bTerminate)修改為while ((aa<499999999)&&!bTerminate)
你不就想要在DLL加载时开启Thread,在DLL卸载时关闭Thread吗
那就
在DLL_PROCESS_ATTACH时CreateThread
在DLL_PROCESS_DETACH时TerminateThread
可以在CreateThread传入宿主进程的句柄,然后Threac完成任务之后发送自定义消息给宿主进程,宿主进程接收到消息之后执行FreeLibrary
这可以说是一个Windows的bug来的,《Window高级编程指南》这本书的433页就写了这个情况,我就是想有什么办法在DLL_PROCESS_ATTACH里能开启线程而不令WaitForSingleObject无响应就可以了
这么做保证会锁死程序……
谢谢大家的回答,不过我可不是做流氓插件……我是学习写外挂的,算是做坏事吗?我的程序的确是用了线程注入,我想的是在软件的使用过程中,如果用户使用一些安全软件把我的dll卸载掉了,能否“优雅”一点地自己关闭线程,然后自行卸载dll,而不要让宿主进程非法操作自动退出呢??其实我知道LoadLibrary后线程是可执行的,不过我想尝试一下在LoadLibrary后马上FreeLibrary这种"极限的情况"下dll是否仍能等待并执行而已,看来windows的确有太多的限制了,无法解决就算了~~~