首页
社区
课程
招聘
[旧帖] 包含mfc的dll的问题. 0.00雪花
发表于: 2011-6-3 18:43 4050

[旧帖] 包含mfc的dll的问题. 0.00雪花

2011-6-3 18:43
4050
写了个热血江湖外挂框架, 注入一个含有mfc资源的dll到游戏进程中去, 在游戏进程中可以呼唤出这个dll中的窗体.但是退出的时候有点问题.

如果从来没在游戏中呼唤出dll中的窗体, 那么当dll被卸载的时候, 一切正常.
但是如果一旦呼唤出dll的窗体, 那么当dll被卸载的时候, 有时候会使得游戏崩溃. 这是为什么啊?

当dl为debug版本, 且出现问题, 游戏崩溃的时候, 报错:


源码:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState());

        BOOL bKeyUp = lParam & (1<<31);

        if ((VK_HOME == wParam) && bKeyUp && code == HC_ACTION)               
        {
                if (NULL == g_wgDllDlg)
                {
                        g_wgDllDlg = new CFzDllDlg;
                        g_wgDllDlg->Create(CFzDllDlg::IDD, NULL);
                        g_wgDllDlg->ShowWindow(SW_SHOWNORMAL);
                }
                else
                {
                        if (g_wgDllDlg->IsWindowVisible())
                                g_wgDllDlg->ShowWindow(SW_HIDE);
                        else
                                g_wgDllDlg->ShowWindow(SW_SHOW);
                }
        }

        return CallNextHookEx(g_hHook, code, wParam, lParam);
}

BOOL SetHook()
{
        if (NULL != g_hHook)
        {
                AfxMessageBox("g_hook != null");
                return FALSE;
        }
               
        HWND hGameWnd = FindWindow(NULL, "YB_OnlineClient");
        if (NULL == hGameWnd)
        {
                AfxMessageBox("not find window");
                return FALSE;
        }
               
        DWORD dwGamePid = 0;
        DWORD dwGameTid = 0;
        dwGameTid = GetWindowThreadProcessId(hGameWnd, &dwGamePid);

        //如果传递的是null, 那么这里获得的是exe的句柄, 可以用GetModuleFileName来验证
        HMODULE hModule = GetModuleHandle("RxjhFzDll.dll");

        //注意最后一个参数是thread id而不是process id
        g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hModule, dwGameTid);               
        if (NULL == g_hHook)
                return FALSE;
        else
                return TRUE;
}

BOOL UnSetHook()
{
        bool bRet = false;

        if (NULL != g_hHook)
        {
                bRet = ::UnhookWindowsHookEx(g_hHook);
                g_hHook = NULL;
        }
       
        return bRet;
}

int CRxjhFzDllApp::ExitInstance()
{
        // TODO: 在此添加专用代码和/或调用基类
        if (NULL != g_wgDllDlg)
        {
                delete g_wgDllDlg;
                g_wgDllDlg = NULL;
        }

        return CWinApp::ExitInstance();
}

完整的工程在附件中.

还请大家帮我看看, 不胜感激.

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
试试生成一个 released版本  然后用released版本试下,不要用DEBUG版本
2011-6-7 12:01
0
雪    币: 36
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这是DEBUG模式下的断言错误,意味着你有指针跑飞了,请楼主检查指针问题;另外,即使你生成release版本的也可能存在问题,所以请楼主检查一下调用函数时的参数问题,一般的在wincore.cpp里边错,说明传入指针错误
2011-6-7 14:29
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ShowWindow(SW_HIDE)对窗口进行隐藏时,并未有效的释放资源
而模态对话框弹出时的影响对于这些隐藏窗口的资源进行了很好的释放,
非模态的对话框在释放指针前,
需要自己调用distroy函数销毁窗口
可以改为
int CRxjhFzDllApp::ExitInstance()
{
  // TODO: 在此添加专用代码和/或调用基类
  if (NULL != g_wgDllDlg)
  {
    g_wgDllDlg->DestroyWindow();
    delete g_wgDllDlg;
    g_wgDllDlg = NULL;
  }

  return CWinApp::ExitInstance();
}
2011-6-7 19:01
0
雪    币: 377
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
当然要注意DEBUG 和 NDEBUG 的问题,同时要撤销用户窗口对象
2011-6-10 15:03
0
雪    币: 78
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看来在哪都能碰到不结贴的,都回答那么清楚了
2011-6-12 21:55
0
游客
登录 | 注册 方可回帖
返回
//