返回String类型时Visual Basic WPF加载ATL C++ dll程序退出

Posted

技术标签:

【中文标题】返回String类型时Visual Basic WPF加载ATL C++ dll程序退出【英文标题】:Visual basic WPF load ATL C++ dll program exit when return String type 【发布时间】:2021-04-10 01:22:46 【问题描述】:

我正在使用带有dll 的 VB.net WPF,该项目由 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”返回整数时程序不退出。

只有 BSTR 、 LPTSTR 、 LPSTR 类型返回 make proram 退出。

【问题讨论】:

BSTR改成char*能解决问题吗? BSTR test2 = L"helloworld" 总是错误的。首先尝试改成BSTR test2 = SysAllocString(L"helloworld"); 感谢我在声明中使用 SysAllocString(L"helloworld")... sprint(...) As &lt;MarshalAs(UnmanagedType.LPStr)&gt; String 解决的所有问题 【参考方案1】:

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

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

【讨论】:

以上是关于返回String类型时Visual Basic WPF加载ATL C++ dll程序退出的主要内容,如果未能解决你的问题,请参考以下文章

Visual.Basic语法基础之四

Visual Basic 6代码中的运行时溢出错误

从Visual Basic中的结构中的函数返回值

GetSubKeyNames 函数在 C# 和 Visual Basic 中返回不同的子键

在Visual Basic 6中,Environ()函数为CLIENTNAME返回null值

Visual.Basic语法基础之二