返回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 <MarshalAs(UnmanagedType.LPStr)> 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程序退出的主要内容,如果未能解决你的问题,请参考以下文章
GetSubKeyNames 函数在 C# 和 Visual Basic 中返回不同的子键