我总是报错:(,一般你们是怎么做的

解决方案 »

  1.   

    DialogBoxA(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,CountdownDialogProcedure);
    我又这么写还是不行:(
      

  2.   

    static link with mfc*.dll
      

  3.   

    还有就是说,我是在dll里面调用对话框的,也就是说,别的程序装入这个dll,dll文件内部放了一个钩子,当满足了某个条件,dll弹出一个对话框,我不知道这样行不行,还是非得别的程序(装入dll的程序)来调用这个dll里的对话框资源然后弹出对话框,也就是说到底应该谁来弹出对话框,到底是dll还是装入dll的程序,还是都可以,谢谢
      

  4.   

    upupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppupupupupupuppup
      

  5.   


    这个方法可以,我刚用了。
    HINSTANCE hInst;
    hInst = GetModuleHandle("你的dll的文件名称");
    DialogBoxA(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,CountdownDialogProcedure);
      

  6.   

    对了,请问你的CountdownDialogProcedure函数是怎么写的,谢谢
      

  7.   

    你说的对,是hInst 的问题,现在好了,但是我的窗口无法相应消息,但是我的程序里面是有相应的message来响应的
      

  8.   

    使用com接口吧,绝对没有问题,客户端程序根本不用改变什么
      

  9.   

    我是说在dll工程中加上一个com接口,不用专门的写com接口
      

  10.   

    使用cwinthread来建立窗口和消息循环,应该没问题。
      

  11.   

    一般是由于资源句柄不对,用AfxSetResourceHandle 把资源句柄设为你的动态库的资源句柄,对话框create出来之后再用它把资源句柄设回去。
      

  12.   

    根本没有这么麻烦
    你先加入一个对话框资源然后给他创建一个类,然后作一个函数用于引出
    BOOL __declspec(dllexport)ShowDlg()
    {    AFX_MANAGE_STATE(AfxGetStaticModuleState());//这句必须有
        CMYDlg dlg;
       dlg.Domodal()
    }
    在外面调用ShowDlg()就OK了
    和编写再一个程序中完全一样
      

  13.   

    如果需要返回值可以加在ShowDlg(int *,int *)这样写
      

  14.   

    akiy(宏) 的意思是让exe来调用dll资源吧,也就是让exe来调用ShowDlg这个函数,但是我现在是全部由dll完成,dll自己直接在满足某个条件后就弹出对话框,不用exe做任何事情
      

  15.   

    CountdownDialogProcedure其实就是普通的callback函数。
    这个函数可以处理应用程序的消息。
    LRESULT CALLBACK CountdownDialogProcedure(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_INITDIALOG:
    return TRUE; case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
    {
    EndDialog(hDlg, LOWORD(wParam));
    return TRUE;
    }
    break;
    }
        return FALSE;
    }
      

  16.   

    我找到问题了,好像我只要在最后加上
    return DefWindowProc(hwnd,message,wParam,lParam);
    就不行,窗口好像死了一样的没反映,否则的话可以正常工作,但是还有个问题,dialogbox函数到底以谁作为父窗口,我发现好像不是以调用的exe作为父窗口,由于我是拦截鼠标的动作然后弹出对话框的,这样一来好像以鼠标所在的窗口当作了父窗口,我程序强行退出,鼠标所在的窗口的程序也死掉了,但是我没有牵扯倒它呀我的代码是这样的LRESULT __declspec(dllexport)__stdcall  CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if(HC_ACTION==nCode)
        {
    if (wParam == WM_RBUTTONUP)
    {
    LPMOUSEHOOKSTRUCT msinfo;
    msinfo=(LPMOUSEHOOKSTRUCT)lParam;
    CRect rt(0,0,20,20);
    if(PtInRect(&rt,msinfo->pt)){
    sndPlaySound(msg+"sound\\num-.wav",SND_ASYNC);
    HINSTANCE hInst1;
    hInst1 = GetModuleHandle("hodll.dll");
    DialogBoxA(hInst1,MAKEINTRESOURCE(IDD_DIALOG2),NULL,CountdownDialogProcedure);
    }
    }
        }
        return CallNextHookEx(hms, nCode, wParam, lParam); 
    }
      

  17.   

    至于CountdownDialogProcedure的代码和楼上的差不多,我就不贴了
      

  18.   

    事不是exe启动了dll并不重要
    只要dlg能够弹出了,他自己就能处理各种消息了。反正exe和dll程序都不能自己启动,不想太快探出可以在入口函数中先创建一个对话框,并让对话框监视消息,受到消息后才弹出也是一样的。
    呵呵,我也学习其他的方法ing
      

  19.   

    谢谢各位的帮助,尤其是 akiy(宏) 和 forestandsea(forestboy) 两位
    我现在程序可以达到指定的效果,但是不是很理想,就像我上面所说,仿佛父窗口是鼠标所在的窗口,真是奇怪,这是为什么,我只是捕捉鼠标的动作啊,并没吧鼠标所在窗口当父窗口句柄啊,够怪,反正我觉得消息处理方面有点问题,哪位有比较好的dll弹出对话框的例子可以让我参考一下吗,万分感谢,一定另外加分
      

  20.   

    至于楼上的楼上的楼上的楼上的。说的com dll我觉得好像还没那必要,因为我不想把他做成active X 的dll或ocx,那样不是很好,我别的控件可能会用,但是这里我觉得不是很适合
      

  21.   

    还想问一下,如果按照CountdownDialogProcedure这样的话,我所有的消息都要手工的在里面写了这样太麻烦,但是我定义的这个IDD—DIALOG2的类的mfc代码好像不起作用,如何指定dialogbox的最后一个参数让他可以运行mfc的代码就是那个IDD_DIALOG2的类的代码而不是需要我手工来创建一个消息循环,毕竟api比mfc麻烦啊
      

  22.   

    abrams(去魔兽3不?) :现在感到有点糊涂了。:)
    你应该手动填写你的消息啊!
    在Win32里面也是可以嵌入mfc的代码的。
    你只要响应消息循环就可以了。
    如果让dlg一启动,直接就运行代码,可以在WM_INITITALIZE中实现。
      

  23.   

    我可没胡涂啊,我思路清楚明白的很:)
    我这么说把,我用
    DialogBoxA(hInst1,MAKEINTRESOURCE(IDD_DIALOG2),NULL,CountdownDialogProcedure);
    来弹出窗口,IDD_DIALOG2是我画的一个窗口的界面
    CountdownDialogProcedure是我创建的窗口的消息处理函数
    关键就是处理这个函数的代码,用api写过窗口的朋友应该知道
    这个函数相等于WndProc并且最后一句代码应该是
    return DefWindowProc (hwnd, message, wParam, lParam) 
    但是我不行,这样就会窗口没反映反而不处理任何消息
    如果我直接return 一个数,ok窗口可以响应消息了,现在可以拖动,可以关闭,但是,关闭后窗口又会自动打开,要点了20几下关闭才能关闭窗口,我估计是消息的问题,照例说调用windows默认的defwindowproc应该没问题,但是我为什么不行呢就是,奇怪啊,我没胡涂只是被这个问题弄的烦死了,希望各位指点
      

  24.   

    用::MessageBox( NULL, "false", "false_reason", MB_OK )不就省事情了吗?
      

  25.   

    int TestReturn()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); CTestDlg Dlg_test;
    if(IDOK == Dlg_test.DoModal())
    {
    return 1;
    }
    return 0;
    }