动态调用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导出很烦的。