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 に答える