如果你必须用常规的DLL,建议你用SDK来实现Dialog,就是DialogBox(...)宏函数;DialogBox (hinst, MAKEINTRESOURCE (IDD_MYDIALOG), NULL, (DLGPROC)MyDlgFunc);

解决方案 »

  1.   

    我做了个最简单的对话框试了一下,结果……很正常啊,不知你的对话框有何不寻常之处?(是否往里面添加了ActiveX控件?)
    另外__declspec(dllexport)前面好像不用加extern吧。
      

  2.   

    上一期的
    程序员大本营中有一段,希望对你有帮助当你在DLL中使用资源时,有些小细节需要注意,首先,在DLL运行时,必须保存DLL的实例,可以通过AfxInitExtensionModulestatic AFX_EXTENSION_MODULE extensionDLL;extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
    {
       if (dwReason == DLL_PROCESS_ATTACH)
          {
          // Extension DLL one-time initialization
          if (!AfxInitExtensionModule(extensionDLL, hInstance))
             return false;
          }   return(true);
    }
    然后,每次使用DLL资源时,你必须改变资源的句柄,使其指向DLL,并保存exe的资源,以便以后正确恢复
    void get_DLL_resource(void)
    {
       /* this function changes the resource handle to that of the DLL */
       //这个函数改变资源句柄使其指向DLL
       if (resource_counter == 0)
          {
          save_hInstance = AfxGetResourceHandle();
          AfxSetResourceHandle(extensionDLL.hModule);
          }   resource_counter++;
    }
    接着你需要其它函数来恢复资源句柄void reset_DLL_resource(void)
    {
       /* this function restores the resource handle set by
    'get_DLL_resource()' */   if (resource_counter > 0)
          resource_counter--;   if (resource_counter == 0)
          AfxSetResourceHandle(save_hInstance);
    }
    接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题.原因是可执行文件必须重画工具条等等,比如说,如果用户移动DLL的对话框,如果资源句柄仍然为DLL的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的OnInitDialog()中,这时对话框的模板等已经读出了.
      

  3.   

    楼上的老兄,题目上说的是“常规”而非扩展DLL啊。
      

  4.   

    确实静态连接可以编译,但我需要动态连接啊,
    另外,才发现一怪现象,Realease版可以编译通过,
    并且程序运行正常,而Debuge版却无论如何都不行,
    难道VC有问题?
      

  5.   


        不可能!我的软件全部都是采用通常DLL(C接口),从来没用过什么特殊的东西。以下代码摘自我的程序:  #define DLLAPI __declspec(dllexport) 
      // 注:引入时,#define DLLAPI  __declspec(dllimport)  ////////////////////////////////////////////////////////////
      DLLAPI void ShowAbout()
      ////////////////////////////////////////////////////////////
      {
          CAboutDlg().DoModal();
      }// End of function.    建议老兄搞清楚DLL的类型及使用方法先。
      

  6.   

    andygood的方法是可以显示对话框的,但如果对话框中有AfxGetMainWnd()之类的语句就会出错!要使之不出错,只能使用MFC扩展DLL,如果有人不明原因,我会解答给你!