卸载载入的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。
确实伤透了脑筋。