0

快速免责声明:我对 P/Invoke 很陌生,所以如果这是一个愚蠢的问题,我提前道歉。

这是我在 C++ 中的函数签名:

HRESULT SomeFunction( 
    _Out_ unsigned long *count,
    _Outptr_result_buffer_(*count) GUID **ids,
    _In_ const PCWSTR filter
)

我正在尝试在 C# 中 P/Invoke 它:

[StructLayout(LayoutKind.Sequential)]
struct GUID
{
   public int a;
   public short b;
   public short c;
   [MarshalAs(UnmanagedType.ByValArray, SizeConst=8)] 
   public byte[] d;
}

[DllImport("MyDll.dll", EntryPoint="SomeFunction")]
[return: MarshalAs(UnmanagedType.I8)]
private static extern Int64 SomeFunction
(
    out ulong count, 
    [MarshalAs(UnmanagedType.LPArray)]
    out GUID[] ids,
    string filter
);

我知道我的代码到达了 C++ 函数(我可以在 windbg 中看到)并且没有崩溃,但据我所知,参数没有正确传递。我的猜测是我在 C# 中搞砸了我的 P/Invoke 翻译,但我不知道如何解决这个问题。任何帮助,将不胜感激!

4

1 回答 1

3

看起来我找到了我的解决方案......

[DllImport("MyDll.dll", EntryPoint="SomeFunction")]
[return: MarshalAs(UnmanagedType.I4)]
private static extern int SomeFunction
(
    out uint count, 
    [MarshalAs(UnmanagedType.LPArray)]
    out GUID[] ids,
    [InAttribute()] 
    [MarshalAsAttribute(UnmanagedType.LPWStr)] 
    string filter
);
于 2012-08-17T23:26:05.647 回答