私はC#で次のインターフェイスを使用しており、同じ名前のクラス(Iなし)を実装しています。
[ComVisible(true)]
[Guid("B2B134CC-70A6-43CD-9E1E-B3A3D9992C3E")]
public interface IOrder
{
long GetQuantity();
long GetOrderType();
long GetPositionType();
}
パブリッククラスOrder:IOrderの実装は、3つのプライベートフィールドと、必要な3つのパラメーターを持つコンストラクターです。
他の場所で、次のメソッドを使用して、COMファイルと.tlb/.tlhファイルを介してC++アンマネージコード内で作業したい結果を取得しました。
public ScOrder[] GetOrders()
{
//constant return value for simplicity
return new Order[] {
new Order(1, 2, 3),
new Order(4, 5, 6)
};
}
私はすでに、C#マネージコードを使用してC++アンマネージコード間で基本的な作業を行うことができました。
しかし、クラス配列は別の課題であることが証明されました...
私にとって、COMは新しく、残酷に混乱し、C ++は長い間忘れられていたことを認めます...しかし、私は両方のライブラリを開発しているので、あきらめません。C ++ DLLをプログラムとC#コード間のプロキシとして機能させたい。
明確化:私はMFCもATLも使用していません。C ++コードで#importを使用して、C#で生成されたインターフェイスとクラスポインター、およびまだ完全には理解していないその他のCOMのものを取得します。
1時間の調査の後、私はここに行って助けを求めています>。<
以下は、私が達成しようとしていることのC++コードです。
//this is how the instance of C# gets created, read it from the internets
//this type has the method GetOrders
IProxyPtr iPtr;
CoInitialize(NULL);
iPtr.CreateInstance(CLSID_Proxy);
IOrderPtr* ordArr;
//IOrderPtr is just a pointer to the interface type transferred
//right? So IOrderPtr* should represent the array of those pointers, right?
SAFEARRAY* orders;
iPtr->GetOrders(&orders);
この時点で、SAFEARRAY*をIOrderPtr*などに変換するために、まだ理解していないCOMマジックが必要です。これにより、返された配列全体を反復処理して、「Order」タイプのメソッドを呼び出すことができます。
- GetQuantity()
- GetOrderType()
- GetPositionType()
したがって、最初のサイクルでは値1、2、3を取得し、2番目のサイクルでは値4、5、6を取得します。
私はC++とC#の両方のライブラリの作成者なので、このCOMのクレイジーなものをすべてスキップして、コレクション数を取得するメソッドや、特定のインデックスのプロパティの値を取得する他のメソッドを作成できます。
しかし、それは良くないようです。私が欲しいものの仕組みは簡単だと思いますが、グーグルで見つけたすべての答えは常に何かが欠けています。