实在是顶不住了,大家帮帮我吧.
我的程序目的是在记事本中,按F2,弹出一个无模式对话框。我使用的方法是钩子。我在一个MFC 扩展DLL中完成了这个程序的核心,使用消息钩子
核心如下:
....
reg *g_pWnd  //reg是我建立的无模式对话框类名
...
LRESULT WINAPI MsgHookProc(int code, WPARAM wParam, LPARAM lParam)
{
PMSG pMsg = (PMSG)lParam;
if(pMsg->message == WM_KEYDOWN)
{
             if (pMsg->wParam == VK_F2)
{
                        g_pWnd = new reg();
g_pWnd->Create(reg::IDD);
g_pWnd->ShowWindow(SW_SHOW);
} }
.......目的无非就是在记事本中按F2,弹出对话框。现在的效果是,一运行,弹出一大堆
Debug Assertion Failed,一直点“忽略”,最后才能看见对话框。
功能是实现了,但Debug Assertion Failed是怎么回事~~??大家帮帮我啊~
PS.我把显示对话框的代码加到钩子函数里——就是一下钩子,就弹出,可以正常运行。

解决方案 »

  1.   

    如果在弹出对话框的地方加上MessageBox会怎样??
    如果出现则是你对话框的问题,
    否则就是Hook问题,你的代码不全啊!!!
      

  2.   

     Assertion   Failed说明了很多断言失败
    可能一些控件创建失败!
    调试进去看看 什么都清楚了!
      

  3.   

    补充一下,这个程序的唯一问题就是弹出对话框以前,会弹出Assertion   Failed,其余 都没有问题,包括弹MessageBox,或是在别的地方弹对话框.
      

  4.   

    你发布的程序版本是debug版本的吗?发布release的试试,在release版中,断言不起作用。
      

  5.   

    好了,果然在release里可以,但我错在什么地方呢?为什么DEBUG 里不可以呢?哪为大哥留个邮箱,我把全部的代码发给你
      

  6.   

    先把MsgHookProc中的代码贴上,大家都能看
      

  7.   

    DLL中全部的代码
    #include "stdafx.h"
    #include <afxdllx.h>
    #include "reg.h"  // 这个是要开的对话框
    ....
    #pragma data_seg("Sd")
    HHOOK g_hook = NULL; // 钩子句柄
    DWORD Pid = NULL;//进程id
    #pragma data_seg()
    #pragma comment(linker,"/section:Sd,RWS")reg *g_pWnd = NULL;LRESULT CALLBACK MsgHookProc(int code, WPARAM wParam, LPARAM lParam)
    {
    PMSG pMsg = (PMSG)lParam;
    if(pMsg->message == WM_KEYDOWN)
    {
    if (pMsg->wParam == VK_F2)
    {
    g_pWnd = new reg();
    g_pWnd->Create(reg::IDD);
    g_pWnd->ShowWindow(SW_SHOW); } }
    return(CallNextHookEx(g_hook, code, wParam, lParam));
    }
    void SetHook(DWORD h_word)
    {
    Pid = h_word;
    g_hook = SetWindowsHookEx(WH_GETMESSAGE, MsgHookProc,GetModuleHandle(L"mfcdll"),Pid);
    }def中的字段
    ....
    EXPORTS
    SetHook
      

  8.   

    MsgHookProc中没有判断Code,但不确定是不是这个问题影响的.
    if (code >= 0)
    {
    PMSG   pMsg   =   (PMSG)lParam; 
    if(pMsg-> message   ==   WM_KEYDOWN) 

    if   (pMsg-> wParam   ==   VK_F2) 

    g_pWnd   =   new   reg(); 
    g_pWnd-> Create(reg::IDD); 
    g_pWnd-> ShowWindow(SW_SHOW); } 
    }

    另外,g_pWnd没有delete
      

  9.   

    可以Hook键盘。
    显示对话框可以用线程。
      

  10.   

    还是不行,只能在release中才行 .先把分给大家,谢谢了