我有一个来自本机代码的示例函数
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创建字符串。什么是正确的电话?
任何帮助将不胜感激。
答案 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
的规范。再次,请查阅本机头文件以确定。