2

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

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

任何帮助将不胜感激。

4

1 回答 1

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在问题中包含规范。再次,请参阅本机头文件以确保。

于 2013-08-08T06:54:28.447 回答