6

次の宣言 (インターフェイスと実装の両方) を持つマネージ関数があります。

[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
String[] ManagedFunction()
{
    String[] foo = new String[1];
    foo[0] = "bar";
    return foo;
}

マネージ インターフェイスと同じメソッドを持つネイティブ C++ インターフェイスもあり、そのインターフェイス内に、このメソッドには次の宣言があります。

void ManagedFunction(SAFEARRAY* foo); 

この関数は、次の方法でネイティブ コードによって呼び出されます。

void NativeFunction(ManagedBinding binding)
{
    CComSafeArray<BSTR> cComSafeArray;
    cComSafeArray.Create(); 
    LPSAFEARRAY safeArray = cComSafeArray.Detach();
    binding.comObject->ManagedFunction(safeArray); 
}

何が間違っているのかわかりませんが、マネージ関数が呼び出された後safeArray、戻り値をネイティブコードにマーシャリングしているときに何か問題が発生しているように見えます。.Net 相互運用に関して私よりも経験のある人は、これに光を当てることができますか? また、ValueTypeマネージ関数から s を返すことに問題がなかったことに言及することも関係があるかもしれません (興味がある場合) 。配列をboolean返すことについて何かが混乱しています。Stringありがとう!

4

2 に答える 2

0

1)あなたの関数は a を返すSAFEARRAYので、関数を呼び出す前にそれを割り当てるのはなぜですか?
2) ManagedFunctiona を返すはずなSAFEARRAYので、SAFEARRAY*返すことができるようにするには a を取得する必要があります! だからあなたは言うべきです:

LPSAFEARRAY lpsa;
binding.comObject->ManagedFunction(&lpsa);
CComSafeArray<BSTR> cComSafeArray;
cComSafeArray.Attach(lpsa);
于 2012-12-01T00:03:29.373 に答える
0

さて、私はついにそれを機能させました。SAFEARRAY呼び出されたManagedSafeArray(ここから盗まれた: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/6641abfc-3a9c-4976-a523-43890b2b79a2/ )の管理された表現を作成しました。

[StructLayout(LayoutKind.Sequential)]
struct ManagedSafeArray
{
    public ushort   dimensions;     // Count of dimensions in the SAFEARRAY
    public ushort   features;       // Flags to describe SAFEARRAY usage
    public uint     elementSize;    // Size of an array element
    public uint     locks;          // Number of times locked without unlocking
    public IntPtr   dataPtr;        // Pointer to the array data
    public uint     elementCount;   // Element count for first (only) dimension
    public int      lowerBound;     // Lower bound for first (only) dimension
}

メソッドのシグネチャを次のように変更しました。

void ManagedMethod(ref ManagedSafeArray foo);

メソッド内で、手動でdataPtr呼び出してフィールドを更新し、含めるMarshal.AllocCoTaskMem(...)文字列をコピーしました。SAFEARRAY

CLRがネイティブコードとの間でパラメーターを自動的にマーシャリングできなかった理由についてはわかりませんが、誰かがそれを説明しようとしてくれれば幸いです。

于 2012-12-03T18:32:54.163 に答える