从DLL打开一个对话框

时间:2010-01-16 16:04:39

标签: c# c++ windows visual-studio

我有一个包含两个项目的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?

2 个答案:

答案 0 :(得分:0)

你可能正朝着正确的方向前进。我假设你想要/需要在你的DLL中使用MFC。

WinApp和MANAGE_STATE建议很好。

你是否在任何C ++源文件上抛出/ clr或/ clr:pure?为什么?您的C ++ DLL是否将托管代码和本机代码混合在一起?

这个简单的应用程序的修复是不抛出/ clr。这将使您的所有C ++代码都本机化,并确保您不会有从加载程序锁定调用托管静态初始化程序的风险。

马丁

答案 1 :(得分:-1)

请参阅上面的评论,但我建议作为我的回答:

使用System.Windows.Forms.OpenFileDialog代替OR

使用GetOpenFileName