1

まず、私は COM 開発者ではありません。標準の C++、C#、および Java を知っています。

Managed C++ から呼び出される C# ライブラリがあります。Visual Studio 2010 --> TypeLib の MFC クラスを使用して C++ クラスを追加しました。ただし、自動生成された C++ クラスはコンパイルされません。明らかに return ステートメントがありません。これを修正するにはどうすればよいですか? どんな助けにも真剣に感謝します。

ライブラリの C# クラス

[Serializable]
[
       ClassInterface(ClassInterfaceType.AutoDual),
       ProgId("Response")
]
public class Response
{
    public static readonly int NUM_DATA = 6;

    public Response()
    {
        data = new Data[NUM_DATA];
        for (int i = 0; i < NUM_DATA; ++i)
        {
            data[i] = new Data();
        }
    }

    private Data[] data;
    public Data[] Data
    {
        [return: MarshalAs(UnmanagedType.SafeArray)]
        get
        {
            return data;
        }
    }
}

マネージ C++ 生成クラス

class CResponse : public COleDispatchDriver
{
public:
    CResponse(){} // Calls COleDispatchDriver default constructor
    CResponse(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
    CResponse(const CResponse& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

    // _Response methods
public:
    SAFEARRAY * get_Data()
    {
        InvokeHelper(0x60020004, DISPATCH_PROPERTYGET, VT_EMPTY, NULL, NULL);
    }
}
4

1 に答える 1

0

この問題には 3 つの一般的な解決策があるようです。1 つ目は、戻り値の配列をパラメーターとして関数に渡すことです。このように:

CustomData[] getCustomDataArray();
void getCustomDataArray(out CustomData[]);

2 番目のオプションは、配列全体を使用するのではなく、配列にアクセスするための関数を作成することです。

CustomData getCustomDataAt(int index);
void setCustomDataAt(int index, CustomData data);

最後のオプションは、MarshalAs 属性を変更することです。最も一般的に受け入れられているソリューションと思われる最初のオプションを使用します。これが他の人に役立つことを願っています。

于 2012-04-25T23:06:00.430 に答える