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

卸载载入的DLL后程序崩溃解决办法

2012-03-23 
卸载载入的DLL后程序崩溃测试用的应用程序可以加载这个DLL,并可以正常使用。但是程序在卸载这个DLL成功后就

卸载载入的DLL后程序崩溃
测试用的应用程序可以加载这个DLL,并可以正常使用。但是程序在卸载这个DLL成功后就崩溃了,
我用VB、VC写的程序卸载这个DLL后都会崩溃,程序载入其他DLL、再卸载都没问题,但是这个DLL就出问题了。
应用程序是卸载DLL成功后才崩溃的,FreeLibrary已经返回1了,程序还是崩溃,
后来跟踪调试发现 DLL_PROCESS_DETACH 传入的时候。UnregisterHotKey和SetWindowLong的返回值都显示失败。
这段DLL代码出了什么问题?应该怎么修改?



BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
  switch(dwReason)
  {
  case DLL_PROCESS_ATTACH:
  hwnd1 = GetForegroundWindow();
  proc = (WNDPROC)GetWindowLong(hwnd1,GWL_WNDPROC);
  SetWindowLong(hwnd1,GWL_WNDPROC,(LONG)WindowProc);
  RegisterHotKey(hwnd1,id,fsModifiers,vk);
  break;
  case DLL_PROCESS_DETACH:
  UnregisterHotKey(hwnd1,id);
  SetWindowLong(hwnd1,GWL_WNDPROC,(LONG)proc);
  break;
  }
  return 1;
}









以下是完整的代码:

以下是完整的代码:


#include "afx.h"
#include "windows.h"
#define mb(str) MessageBox(NULL,str,"CSF",NULL)


int id = 49;
UINT fsModifiers = MOD_ALT;  
UINT vk =0x41; //A键
WNDPROC proc = 0;
HWND hwnd1 = 0;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
  switch(dwReason)
  {
  case DLL_PROCESS_ATTACH:
  hwnd1 = GetForegroundWindow();
  proc = (WNDPROC)GetWindowLong(hwnd1,GWL_WNDPROC);
  SetWindowLong(hwnd1,GWL_WNDPROC,(LONG)WindowProc);
  RegisterHotKey(hwnd1,id,fsModifiers,vk);
  break;
  case DLL_PROCESS_DETACH:
  UnregisterHotKey(hwnd1,id);
  SetWindowLong(hwnd1,GWL_WNDPROC,(LONG)proc);
  break;
  }
  return 1;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{

if(uMsg!=WM_HOTKEY)
{
return CallWindowProc(proc,hwnd1,uMsg,wParam,lParam);
}
else
{
if((int)wParam == id)
{
mb("aaaaaaaaaaaaaaaaa");
}
}
return 1;
}

[解决办法]
SetWindowLong
使用这个函数子类化窗口,在退出的时候很危险。

因为退出操作可能就是你的窗口函数发起的。
此时你卸载了这个模块。
你让我们的 return 语句返回哪里呢?
// 呵呵,你惨了。

我在远程注入 DirectX 程序的时候,为了卸载注入的 DLL。
确实伤透了脑筋。

热点排行