从C函数编组LPWSTR *

时间:2013-08-08 06:05:42

标签: c# pinvoke marshalling dllimport

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

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创建字符串。什么是正确的电话?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

您需要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的规范。再次,请查阅本机头文件以确定。