return 字符串类型时,Visual Basic WPF 加载 ATL C++ dll 程序退出

Visual basic WPF load ATL C++ dll program exit when return String type

我正在使用 VB.net WPF 和 dll 使用 ATL 为这个项目制作 但每次我 运行 dll 函数,程序退出时没有错误 请告诉我为什么不起作用以及如何解决它。

c++函数

extern "C" __declspec(dllexport) BSTR __cdecl sprint(LPSTR str1, LPSTR str2) {
    TCHAR test[100];
    sprintf_s(test, 100, "%s %s", str1, str2);

    BSTR test2 = L"helloworld";
    return test2;
}

VB.net代码

声明

    <DllImport("database.dll", CallingConvention:=CallingConvention.Cdecl)>
    Private Shared Function sprint(ByVal str1 As String, ByVal str2 As String) As String
    End Function

用法

    Private Sub On_Submit_Btn_Clk(sender As Object, e As RoutedEventArgs)
        testStr = sprint("hello", "world")
        MessageBox.Show(testStr)
    End Sub

问题:

调用函数“sprint”时程序退出。

没问题:

函数“sprint”时程序不退出return整数。

仅 BSTR、LPTSTR、LPSTR 类型 returns 使 proram 退出。

在 COM 编程中,BSTR 是一个特殊的 LPWSTR,由 SysAllocString 分配,由 SysFreeString 释放。字符前面是字符串长度,偏移量为 -1。这意味着您可以将 BSTR 传递给所有需要 LPCWSTR

的函数

L"helloworld" 是 C++ 字面量,除了 const 部分外,它几乎与 LPWSTR 类型匹配。 VC++ 将掩盖最后一个小问题。 MSVC 中最简单的解决方案是对 BSTR 使用 _bstr_t 包装器类型,它会为你做 SysAllocString。否则您需要手动完成。