WaitForSingleObject和CreateThread在dll中的初始化里运行的问题,急!!!!!!

qjipa 2007-05-12 01:52:36
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,可能语法有错误,希望能帮助一下,谢谢了!!!!!!!!

...全文
1014 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjipa 2007-05-19
  • 打赏
  • 举报
回复
好了,给分了~~~~
谢谢大家的回答,不过我可不是做流氓插件……我是学习写外挂的,算是做坏事吗?

我的程序的确是用了线程注入,我想的是在软件的使用过程中,如果用户使用一些安全软件把我的dll卸载掉了,能否“优雅”一点地自己关闭线程,然后自行卸载dll,而不要让宿主进程非法操作自动退出呢??

其实我知道LoadLibrary后线程是可执行的,不过我想尝试一下在LoadLibrary后马上FreeLibrary这种"极限的情况"下dll是否仍能等待并执行而已,看来windows的确有太多的限制了,无法解决就算了~~~
蒋晟 2007-05-17
  • 打赏
  • 举报
回复
〉在DllMain中再LoadLibrary一次自己,不要FreeLibrary,问题也许可以解决
这么做保证会锁死程序……
thinp 2007-05-15
  • 打赏
  • 举报
回复
回了两次,说点别的,我怀疑楼主要做IE插件或是流氓软件之类的东西,这种产品能不做就不做,不是长久之计,做软件还是得脚踏实地做真正好的产品,外国有许多软件之所以成功,并不是说软件创意有多牛,主要是持之以恒,一两年不赚钱,坚十年肯定可以成为此领域的领军产品,做技术的就有这点好处,可以持续更新你的技术
thinp 2007-05-15
  • 打赏
  • 举报
回复
怎么还没有解决,大家先要明确一点,宿主程序不是楼主写的,如果是楼主写的,这种问题很简单,也就是宿主程序是别人写的,楼主无法控制宿主程序,所以要执行DLL加载的时候要使宿主程序不堵死,要不然宿主程序就没有反应了,有一种方法,在DllMain中再LoadLibrary一次自己,不要FreeLibrary,问题也许可以解决,不过没试过会不会宿主程序主动FreeLibrary,不同的宿主程序执行不一样(程序安全上的问题),楼主可以试一下
长尾巴的悟空 2007-05-14
  • 打赏
  • 举报
回复
随便给点分...
蒋晟 2007-05-14
  • 打赏
  • 举报
回复
可以开一个定时器,不一定要线程
kantonwang2007 2007-05-14
  • 打赏
  • 举报
回复
没怎么看明白,不过用到多线称等待的时候,可以用event和WaitForSingleObject来进行的
qjipa 2007-05-13
  • 打赏
  • 举报
回复
没有人懂吗????
artcpp 2007-05-12
  • 打赏
  • 举报
回复
搞不懂为何要用While,Sleep不行吗?
developCpp 2007-05-12
  • 打赏
  • 举报
回复
抱歉,還有個地方寫錯了,
將while ((aa<499999999)&&bTerminate)修改為while ((aa<499999999)&&!bTerminate)
developCpp 2007-05-12
  • 打赏
  • 举报
回复
//I'm sorry, please modify this function
// ¶ms -> params
DWORD WINAPI ThreadProc(LPVOID params)
{
DWORD p;
HANDLE gThread;

gThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&NewThreadProc, params,0 ,&p);
developCpp 2007-05-12
  • 打赏
  • 举报
回复
//You can declare a global variable
//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;
}

}
qjipa 2007-05-12
  • 打赏
  • 举报
回复
就是因为CreateThread在DLL_PROCESS_ATTACH这里运行就有问题,
这可以说是一个Windows的bug来的,《Window高级编程指南》这本书的433页就写了这个情况,我就是想有什么办法在DLL_PROCESS_ATTACH里能开启线程而不令WaitForSingleObject无响应就可以了
developCpp 2007-05-12
  • 打赏
  • 举报
回复
或者如果楼主想要在Thread任务完成之后自动通知宿主进程卸载DLL
可以在CreateThread传入宿主进程的句柄,然后Threac完成任务之后发送自定义消息给宿主进程,宿主进程接收到消息之后执行FreeLibrary
developCpp 2007-05-12
  • 打赏
  • 举报
回复
不用那么麻烦
你不就想要在DLL加载时开启Thread,在DLL卸载时关闭Thread吗
那就
在DLL_PROCESS_ATTACH时CreateThread
在DLL_PROCESS_DETACH时TerminateThread
qjipa 2007-05-12
  • 打赏
  • 举报
回复
谢谢了~~~不过还没解决啊……

developCpp:改动后还是不行~~~不是IsThreadTerminate这个变量的问题,我找过在DLL_PROCESS_ATTACH中用WaitForSingleObject无论怎么样线程都会死锁的

thinp:这里怎么样写消息循环?我刚学VC的啊,上面的代码也都是我七拼八凑出来的,实在不知道啊……
thinp 2007-05-12
  • 打赏
  • 举报
回复
其实楼主的需求很简单,它在缩主程序里面执行(我估计是explorer或是ieexplorer之类的程序吧),但这种缩主程序又有个特性,加载时会调用固定的Com接口,此过程缩主程序是在加载程序中的,在主线程(也就是界面线程)中,但楼主要在这个加载过程中干一件事,可能是连接网络之类的吧,我估计,嘿嘿,方法有一种,实现缩主程序必须的接口,让缩主程序不FreeLibrary你,否则无法实现,CreateThread完成后如果不waitforsingleobject,则马上缩主就会freelibrary你,你的thread马上会出错(空间被释放了),如果调了wait,则这个程序就失去了createthread的意义,还不如直接在主线程中调呢,当然,并不是完全没有办法实现,实现的方法是在CreateThread后创建一个windows消息泵,就是用GetMessage,translatemessage....(去查GetMessage从MSDN中),这样主界面会可以,在GetMessage中设一个全局变量,在Thread结束的时候取消这个消息泵,就不写代码了,逻辑大概就是如此

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧