首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

动态调用DLL,不能开释

2012-09-12 
动态调用DLL,不能释放。写了个DLL,主程序动态调用。。想实现,DLL线程给主程序窗口传输信息。。主程序中DLL调用

动态调用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给予的帮助。。谢谢

热点排行