动态调用DLL,不能释放。

lizhuang0032 2012-07-15 03:19:39
写了个DLL,主程序动态调用。。想实现,DLL线程给主程序窗口传输信息。。主程序中DLL调用 后一释放就出错。。。
//-----DLL程序
#pragma argsused
#define WM_USER_THREAD_FINISHED WM_USER+0x400
int gi_SendMessage = 0;
extern "C" _declspec(dllexport) int __stdcall CreThread(HWND Handle);
extern "C" _declspec(dllexport) DWORD WINAPI __stdcall ThreadProc(LPVOID lpParam);

extern "C" _declspec(dllexport) int __stdcall Calc(int a, int b);
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
DWORD WINAPI __stdcall ThreadProc(LPVOID lpParam)
{
while(1)
{
Sleep(500);
gi_SendMessage++;
HWND hd = (HWND)lpParam;
::PostMessage(hd, WM_USER_THREAD_FINISHED, gi_SendMessage, 1);
}
return 0;
}
int __stdcall CreThread(HWND Handle)
{
HANDLE hthread = ::CreateThread(NULL, 0, ThreadProc,Handle, 0, NULL);
CloseHandle(hthread);
if(hthread==0)
return 0;
else
return 1;
}
}
//--------------------------------------------------------------------------


//---主程序调用
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE Hdl;
String API_DLLNameForOUTB;
HMODULE API_CircleArea ;
API_DLLNameForOUTB=ExtractFilePath(Application->ExeName)+"DLLSET.dll";
API_CircleArea=LoadLibrary(API_DLLNameForOUTB.c_str()); //加载动态库
if(API_CircleArea==NULL)
{
String sStr="找不到接口程序["+API_DLLNameForOUTB+"]";
Application->MessageBox(sStr.c_str(),TEXT("错误提示:"),MB_ICONWARNING) ;
return;
}
else
{
typedef int(* CreThread)(HWND Handle) ; //调用CreThread(HWND Handle)
CreThread pv=NULL;
pv=(CreThread)GetProcAddress(API_CircleArea,"CreThread"); //获取函数地址
if(pv)
{
if(pv(Handle)==1)
Label1->Caption = "创建线程成功!" ;
else
Label1->Caption = "创建线程失败!" ;
}
else
{
String sStr= "找不到接口程序函数【CircleArea】";
Application->MessageBox(sStr.c_str(),TEXT("错误提示:"),MB_ICONWARNING) ;
}
// ::FreeLibrary(Hdl); //一定不要忘记调用完毕后释放DLL
}

想请教一下。。。是为什么?
...全文
436 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2012-07-24
  • 打赏
  • 举报
回复
dll 具有监听功能

貌似只能在程序退出的时候,释放dll了。

释放后,谁来监听呢

或者别放在dll里了

放在一个静态库里



dll导出很烦的。


[Quote=引用 17 楼 的回复:]

我的解决办法就是:先在调用这个函数时不释放,等退出时,调用程序先关闭DLL中的线程,然后退出。。。谢谢楼上的各位大哥,你们让我学习了很多。。。我们其实都忽略了一个问题,开线程就是要做监听的,你释放DLL,肯定是先要对DLL中的线程进行挂起的,一挂起就无法实现监听了。。就这样吧,结贴,再次感谢bsnry给予的帮助。。谢谢
[/Quote]
lizhuang0032 2012-07-21
  • 打赏
  • 举报
回复
我的解决办法就是:先在调用这个函数时不释放,等退出时,调用程序先关闭DLL中的线程,然后退出。。。谢谢楼上的各位大哥,你们让我学习了很多。。。我们其实都忽略了一个问题,开线程就是要做监听的,你释放DLL,肯定是先要对DLL中的线程进行挂起的,一挂起就无法实现监听了。。就这样吧,结贴,再次感谢bsnry给予的帮助。。谢谢
FrankieWang008 2012-07-20
  • 打赏
  • 举报
回复
FreeLibrary之前要想办法结束dll里面创建的那个线程.
缘来是梦 2012-07-20
  • 打赏
  • 举报
回复
FreeLibrary之前要想办法结束dll里面创建的那个线程.
dykxjh 2012-07-20
  • 打赏
  • 举报
回复
同样的问题,一释放DLL,程序就会死掉,不知道楼主解决了没有
woaimeili99 2012-07-20
  • 打赏
  • 举报
回复
来学习一下呀,没有得到答案呀。。。
bsnry 2012-07-19
  • 打赏
  • 举报
回复
CMyDialog::ONClose中

SEtEvent,让给线程退出。

然后Sleep几秒 中

关闭句柄

不行吗


[Quote=引用 10 楼 的回复:]
我的这个线程是做监听用的,理论上说,只要程序运行,那么线程就不能关闭。。。我只有关闭主程序后线程才停啊。。。。
[/Quote]
Vincent_Song 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

我的这个线程是做监听用的,理论上说,只要程序运行,那么线程就不能关闭。。。我只有关闭主程序后线程才停啊。。。。
[/Quote]

那你也得在主线程退出之前先退出子线程,然后再释放dll。
bsnry 2012-07-18
  • 打赏
  • 举报
回复
等待了干嘛


[Quote=引用 3 楼 的回复:]
还是有些不明白,想问楼上两位大哥要。

我本来就是要用DLL线程,做监听的。。。。DLL线程中的while是不退出的。
如果我主程序中用WaitForSingleObject(hthread, INFINITE);的话,那么我的程序就死在这了。。。

这个怎么办啊?
[/Quote]
bsnry 2012-07-18
  • 打赏
  • 举报
回复

你自己也说了, 线程收到某个事件后,退出,然后发送消息告诉主线程,然主线程去CloseHandle(子线程句柄),CloseHandle(事件句柄)


[Quote=引用 4 楼 的回复:]
线程创建后,立即CloseHandle,线程不能运行?你的线程一开始就是挂起的,关了句柄自然无法控制恢复。回LZ,你可以退出时POST消息给主线程执行清理工作
[/Quote]
lizhuang0032 2012-07-18
  • 打赏
  • 举报
回复
我的这个线程是做监听用的,理论上说,只要程序运行,那么线程就不能关闭。。。我只有关闭主程序后线程才停啊。。。。
bsnry 2012-07-18
  • 打赏
  • 举报
回复


结贴



[Quote=引用 8 楼 的回复:]
等待了干嘛



引用 3 楼 的回复:
还是有些不明白,想问楼上两位大哥要。

我本来就是要用DLL线程,做监听的。。。。DLL线程中的while是不退出的。
如果我主程序中用WaitForSingleObject(hthread, INFINITE);的话,那么我的程序就死在这了。。。

这个怎么办啊?
[/Quote]
RLib 2012-07-17
  • 打赏
  • 举报
回复
线程创建后,立即CloseHandle,线程不能运行?你的线程一开始就是挂起的,关了句柄自然无法控制恢复。回LZ,你可以退出时POST消息给主线程执行清理工作
RLib 2012-07-17
  • 打赏
  • 举报
回复
是可以运行的。
bsnry 2012-07-17
  • 打赏
  • 举报
回复
HANDLE hthread = ::CreateThread(NULL, 0, ThreadProc,Handle, 0, NULL);
CloseHandle(hthread);




倒数第2个参数?




[Quote=引用 4 楼 的回复:]
线程创建后,立即CloseHandle,线程不能运行?你的线程一开始就是挂起的,关了句柄自然无法控制恢复。回LZ,你可以退出时POST消息给主线程执行清理工作
[/Quote]
lizhuang0032 2012-07-16
  • 打赏
  • 举报
回复
还是有些不明白,想问楼上两位大哥要。

我本来就是要用DLL线程,做监听的。。。。DLL线程中的while是不退出的。
如果我主程序中用WaitForSingleObject(hthread, INFINITE);的话,那么我的程序就死在这了。。。

这个怎么办啊?
bsnry 2012-07-15
  • 打赏
  • 举报
回复
记得一些文章说 创建后就可以Closehandle了,其实是不对的

创建后,立即CloseHandle,线程不能运行。

实践可以得出。

楼主的导出函数里犯了如此错误。

另外:还可以在1楼基础上修改一下:


ThreadProc
这个函数式没有退出 ,线程永远不停,除非主线程,进程死了。

加一个事件Event吧,或者加一个判断标志都行,然子线程可以安全退出。




[Quote=引用 1 楼 的回复:]

HANDLE hthread = ::CreateThread(NULL, 0, ThreadProc,Handle, 0, NULL);
CloseHandle(hthread);

----------------------------------------

CloseHandle不要在这里调用,改到freelibrary之前,并加上等待


WaitForSin……
[/Quote]
陈厚来 2012-07-15
  • 打赏
  • 举报
回复
HANDLE hthread = ::CreateThread(NULL, 0, ThreadProc,Handle, 0, NULL);
CloseHandle(hthread);

----------------------------------------

CloseHandle不要在这里调用,改到freelibrary之前,并加上等待


WaitForSingleObject(hthread, INFINITE);
CloseHandle(hthread);
::FreeLibrary(Hdl); //一定不要忘记调用完毕后释放DLL

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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