2012-04-23 52 views
1

私はCOM開発者ではないと言います。私は標準C++、C#、Javaを知っています。COM TypeLibから自動生成されたC++クラスは、メソッドでSAFEARRAYを返しません。

私は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); 
    } 
} 

答えて

0

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

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

第2のオプションは、すべてを使用するのではなく、配列にアクセスするための関数を書くことです。

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

最終的なオプションは、MarshalAs属性を変更することです。私は、最も一般的に認められている解決策であると思われるので、最初のオプションを使用します。これが他人を助けることを望みます。

関連する問題