从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#代码来接收指针。像这样:
[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
的规范。再次,请参阅本机头文件以确定。