从C函数编组LPWSTR*

本文关键字:LPWSTR 函数 | 更新日期: 2023-09-27 18:27:00

我有一个来自本地代码的示例函数

HRESULT getSampleFunctionValue(_Out_ LPWSTR * argument)

此函数输出参数中的值。我需要从托管代码调用它

[DllImport("MyDLL.dll", EntryPoint = "getSampleFunctionValue", CharSet = CharSet.Unicode)]
static extern uint getSampleFunctionValue([MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder  argument);

这将返回垃圾值。AFAIK原始C函数不使用CoTaskMemAlloc创建字符串。正确的呼叫是什么?

任何帮助都将不胜感激。

从C函数编组LPWSTR*

您需要C#代码来接收指针。像这样:

[DllImport("MyDLL.dll")]
static extern uint getSampleFunctionValue(out IntPtr argument);

这样称呼它:

IntPtr argument;
uint retval = getSampleFunctionValue(out argument);
// add a check of retval here
string argstr = Marshal.PtrToStringUni(argument);

然后,您可能还需要调用本机函数来释放它分配的内存。您可以在调用Marshal.PtrToStringUni之后立即执行此操作,因为此时您不再需要指针。或者可能返回的字符串是静态分配的,我不能确定。在任何情况下,本机库的文档都会解释需要什么。

您可能还需要指定一个调用约定。正如所写的,本机函数看起来像是使用__cdecl。然而,也许您没有在问题中包括__stdcall的规范。再次,请参阅本机头文件以确定。