在dll中关闭Win32对话框时出现异常(来自WPF应用程序)

时间:2016-11-30 08:13:18

标签: c# c++ wpf dll

我有一个从DLL调用C ++函数的C#应用​​程序。 C ++函数仅显示一个对话框和一个退出按钮。

DLL中的C ++函数如下所示:

//the exported function for clients to call in DLL
HINSTANCE hInstance;
__declspec(dllexport) int __cdecl StartDialog(string inString)
{
    hInstance = LoadLibrary(TEXT("My.dll"));
    DialogBox(hInstance, MAKEINTRESOURCE(ID_DLL_Dialog), NULL, DialogProc);
    return 1;
}

BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDD_BUTTON_EXIT:
            DestroyWindow(hwnd);
            return TRUE;            
        }
    }
    return FALSE;
}

如果我在一个简单的C ++程序中调用我的StartDialog函数,它就可以了。我可以显示对话框,当我在对话框中单击退出时可以正确关闭它。

typedef int(__cdecl *StartDialogFunc)(string);
StartDialogFunc StartDialog = nullptr;
HINSTANCE hDll = LoadLibrary(TEXT("My.dll"));
StartDialog = (StartDialogFunc)GetProcAddress(hDll, "StartDialog");

int i = StartDialog("hello");    //this is working
cout << i;

如果我在C#应用程序中调用它,单击退出按钮后,对话框将关闭,并给我一个例外。 C#代码如下:

[DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int StartDialog(string s);

int i = StartDialog("hello");    //this causes a exception

错误信息如下:

  

Debug Assertion失败!

     

程序:(某些路径......)My.dll

     

文件:d:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ xmemory0

     

行:100

     

表达式:“(_Ptr_user&amp;(_ BIG_ALLOCATION_ALIGNMENT - 1))== 0”&amp;&amp; 0

     

有关程序如何导致断言失败的信息,请参阅有关断言的Visual C ++文档。

我怎么知道我的DLL中究竟是什么错误?

1 个答案:

答案 0 :(得分:1)

尝试更改C ++函数签名以获取WCHAR*,因为C ++的std::string与C#不兼容。另外,要获取当前DLL的句柄,请使用GetModuleHandle(NULL),而不是LoadLibrary。

HINSTANCE hInstance;

__declspec(dllexport) int __cdecl StartDialog(const WCHAR* inString)
{
    hInstance = GetModuleHandle(NULL);
    DialogBox(hInstance, MAKEINTRESOURCE(ID_DLL_Dialog), NULL, DialogProc);
    return 1;
}