我有一个 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()
.
为什么会这样?