gpt4 book ai didi

c# - 在 AnsiBStr 的 SafeArray 上调用 PInvoke

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:17 25 4
gpt4 key购买 nike

我有一个旧的 C++ DLL 导出带有 ASCII 字符串输出参数的函数。我设法像这样使用第一个:

[DllImport("MyLibrary.dll")]
private static extern int GetVersion(
[Out, MarshalAs(UnmanagedType.AnsiBStr)]
out string version);

AnsiBStr 类型神奇地将 ASCII 转换为 UTF-16 (unicode),一切正常。

我有另一个使用 AnsiBStr 的 SafeArray 的函数。但我不知道如何做同样的把戏。我的代码如下,由于缺少 ascii/unicode 转换,结果是一组日文字形。

[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi)]
private static extern int GetList(
[Out, MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_BSTR)]
out string[] result);

没有像 VarEnum.VT_ANSI_BSTR 这样的东西,不幸的是......正确的语法是什么?

最佳答案

您始终可以自己编写编码方法并更改编码。试试这个:

[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi)]
private static extern int GetList(
[Out, MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_BSTR)]
out string[] result);

private static string[] GetList()
{
string[] arr;
GetList(out arr);
for(int i = 0; i < arr.Length; i++)
{
var bytes = Encoding.Unicode.GetBytes(arr[i]);
arr[i] = Encoding.ASCII.GetString(bytes);
}
return arr;
}

如果您使用许多类似的方法,您还可以创建自定义编码器。

关于c# - 在 AnsiBStr 的 SafeArray 上调用 PInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28971104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com