我有一个包含两个项目的Visual Studio 2008解决方案:C#Windows窗体应用程序和C ++ DLL。 DLL打开自定义CFileDialog。这是一个演示问题的玩具版本,其中C#app只是一个启动对话框的按钮和一个显示其结果的标签:
DialogApp.cs:
...
public partial class Form1 : Form {
...
[DllImport("DialogDll.dll")]
static extern int OpenDialog();
...
private void button1_Click(object sender, EventArgs e) {
int r = OpenDialog();
label1.Text = r.ToString();
}
}
DialogDll.h:
extern "C" {
__declspec(dllexport) int __cdecl OpenDialog();
}
DialogDll.cpp:
#include <afxdlgs.h>
#include "DialogDll.h"
extern int __cdecl OpenDialog() {
CFileDialog d(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("All Files (*.*)|*.*||"), NULL);
if (d.DoModal() == IFOK) {
return 4;
} else {
return 9;
}
}
当我运行它时,我收到有关调试断言失败的错误,要求中止|重试|忽略。断言是afxCurrentResourceHandle != NULL
。我该如何摆脱这个问题?如果我单击忽略,我会得到我的对话框,一切似乎都正常。
我已经尝试过按照这里的说明操作: http://msdn.microsoft.com/en-us/library/7a51wcfx.aspx
这些说明问题是DLL没有CWinApp对象,我应该在每个函数调用的开头添加AFX_MANAGE_STATE(AfxGetStaticModuleState())
。我这样做了,并且必须按照此处的说明解决链接器问题,手动指定我的DLL的入口点:http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/0b154e1c-141f-4567-bb24-1ac7c8ee2713/(关于更改.libs顺序的部分对我不起作用。)
但现在我又收到了另一个错误:
LoaderLock was detected:
Attempting managed execution code inside OS Loader Lock. Do not attempt to run
managed code inside a DllMain or image initialization function since doing so
can cause the application to hang.
好悲伤!我是否朝着正确的方向前进?我已经完成了多年的编程,但我对Windows平台还不熟悉。我认为在完成所有这些工作后,我的问题仍然很简单:如何从我的dll中打开CFileDialog?
答案 0 :(得分:0)
你可能正朝着正确的方向前进。我假设你想要/需要在你的DLL中使用MFC。
WinApp和MANAGE_STATE建议很好。
你是否在任何C ++源文件上抛出/ clr或/ clr:pure?为什么?您的C ++ DLL是否将托管代码和本机代码混合在一起?
这个简单的应用程序的修复是不抛出/ clr。这将使您的所有C ++代码都本机化,并确保您不会有从加载程序锁定调用托管静态初始化程序的风险。
马丁
答案 1 :(得分:-1)