0

我有一个 MFC 应用程序“分析器”,它使用带有资源的 Dll。

有一个函数可以获取包含在 dll 中的对话框的实例,称为 GetCriteriaDlg。

我的dll文件:

extern "C" {__declspec(dllexport) CCriteriaDlg* GetCriteriaDlg(void );}

in the dll cpp file I have

    extern "C"
{
    __declspec(dllexport) CCriteriaDlg* GetCriteriaDlg(void )
    {
        return &dlg;
    }
}

我使用该函数的 AnalyserDoc.cpp:

extern "C" {__declspec(dllimport) CCriteriaDlg* GetCriteriaDlg(void );}

dll中还有一个类

class AFX_EXT_CLASS CCriteriaDlg : public CDialog

它们与AnalyserDoc.cpp中名为DllImports.h的导出类头文件完全相同

AnalyserDoc.cpp有一个映射到菜单项的函数

Void CAnalyserDoc::OnAnalyseRun()
{
    // TODO: Add your command handler code here
    CCriteriaDlg *dlg=GetCriteriaDlg();
    dlg->DoModal();
}

现在这就是它变得奇怪的地方。如果我拥有程序启动的所有内容,但 MFC 的通常 SD 窗口从未出现,我必须从任务管理器结束进程。

但是,如果我要注释掉窗口的内容,OnAnalyseRun()那么窗口加载正常(但显然它们对方法调用没有任何动作,我尝试交换东西,如果我只声明 *dlg 而没有方法调用,窗口加载正常所以我认为这肯定与GetCriteriaDlg().

为什么会这样?

4

0 回答 0