读书人

动态调用DLL不能开释

发布时间: 2012-09-12 09:21:30 作者: rapoo

动态调用DLL,不能释放。
写了个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
}

想请教一下。。。是为什么?

[解决办法]
dll 具有监听功能

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

释放后,谁来监听呢

或者别放在dll里了

放在一个静态库里



dll导出很烦的。


探讨

我的解决办法就是:先在调用这个函数时不释放,等退出时,调用程序先关闭DLL中的线程,然后退出。。。谢谢楼上的各位大哥,你们让我学习了很多。。。我们其实都忽略了一个问题,开线程就是要做监听的,你释放DLL,肯定是先要对DLL中的线程进行挂起的,一挂起就无法实现监听了。。就这样吧,结贴,再次感谢bsnry给予的帮助。。谢谢

读书人网 >C++

热点推荐