2016-08-16 6 views
0

私はCOMオブジェクトをC++で書いていますが、単純型(int/boolなど)のシーケンスのtypedefを宣言し、その型の変数をC#で作成するためにアクセスしようとしています。このCOMオブジェクトへの参照 私はここに追加私は2つのオプションを書いたtypdefを宣言しようとしました - しかし、それらのどれも私のために働いています - 私はこのタイプのパラメータを私のC#クラスで初期化することはできません。COMオブジェクトidlでtypdefを宣言するには?

[ 
    uuid(0EA0AD9B-9314-4480-8C69-22719C2EA9CF), 
    version(1.0),] 

library ATLProject9Lib 
{ 
    typedef [public,uuid(9d286340-62c4-11e6-8b77-86f30ca893d3)] 
    int aaa; 

    typedef [public] 
    double numberToAdd; 


    struct BarStruct; 
    importlib("stdole2.tlb"); 

    [ 
     uuid(172B34D8-5D19-4635-B4AD-9171F522CA0A)  
    ] 
    dispinterface _IScheduleEvents 
    { 
    properties: 
    methods: 
    }; 
    [ 
     uuid(34413E93-0916-4773-99C4-79163A44E4A0)  
    ] 
    coclass Schedule 
    { 
     [default] interface ISchedule; 
     [default, source] dispinterface _IScheduleEvents; 
    }; 
}; 

第二の問題:例えばint型の配列をtypdefを宣言:このコードはコンパイルされていない

typedef [public,uuid(9d286340-62c4-11e6-8b77-86f30ca893d3)] 
sequence<int> aaa; 

typedef [public] 
double numberToAdd; 

は、ここに私のIDLの関連部分(ライブラリ)です。私は次のエラーを取得してい :

1>.\ATLProject9.idl(47): error MIDL2025: syntax error : expecting a declarator or * near "<" 
1>.\ATLProject9.idl(47): error MIDL2025: syntax error : expecting ; or , near "<" 
1>.\ATLProject9.idl(47): error MIDL2026: cannot recover from earlier syntax errors; aborting compilation 

COMオブジェクトに(単純型のため、シーケンス用)のtypedefを宣言するための正しい方法は何ですか?

答えて

4

あなたがしようとしていることはほとんど意味がありません。 A typedefタイプエイリアスを宣言します。タイプの別の名前です。 C++ではなく、変数を宣言しません。型エイリアスも生き残ることはできません。Tlbimpは、C#コードを記述する必要がある型ライブラリインポータです。型IDはCLRでは非常に大きな問題であり、同じ型を参照するために2つの名前を使用するメカニズムはありません。したがって、型ライブラリインポータはtypedefを元の名前に常に逆コンパイルします。

IDLでは変数を宣言できません。 COMは型の実装を完全に隠す非常に厳しいinterface-based programmingパラダイムを使用します。任意の言語実装間で動​​作できるinteropコードに適している究極の理由。変数はあまりにも多くの手荷物を持っています。さまざまな言語の実装では、変数の格納アドレスとアライメントについてさまざまな選択肢があります。

ジェネリックやテンプレートのいずれも使用できません。そのような機能の実装方法には誰も同意しません。あるいは、それをまったく実装しないでください。 .NETジェネリックは、例えばであり、例えばC++のテンプレートとは異なるです。

これらの制限は非常に意図的です。あなたがC++コードで宣言した変数を公開する唯一の方法は、プロパティゲッターを使ってインターフェースを書くことです。

+0

こんにちは、 お返事ありがとうございます。 しかし、私は完全にお互いを理解しているかどうかはわかりません。 私たちが何をしようとしているのかを説明します: 私たちのC#コードからidl関数を呼び出したいと思います。この関数は、パラメータとしていくつかのtypedef変数を取得します。 私たちは私たちのidlでこれらの型定義を宣言しようとしています。これをC |#で作成し、このidl関数にパラメータとして送ることができます。 – thechmodmaster

+1

"typedef変数"について話すのを止めなければならないでしょう、それは私たちがあなたを助けるのに役立たない全く意味のない言い回しです。IDLにコクラスを必要とする 'new'ステートメントでC#プログラムに何かを作成します。または、COMオブジェクトにインターフェイスポインタを返すファクトリ関数を必要とするようにCOMオブジェクトを作成するよう依頼します。 –

0

MIDLリファレンスドキュメントを確認してください。明らかに、sequenceというキーワードはありません。 Thisが示唆:

typedef struct { 
    int  foo; 
} IntStruct; 

typedef struct { 
    int  cMax; 
    [size_is(cMax)] IntStruct values[]; 
} ListOfInts; 

または

typedef struct { 
    int  foo; 
} IntStruct; 

typedef struct { 
    int  cMax; 
    [size_is(cMax)] IntStruct* values; 
} ListOfInts; 

あなたが本当にaaanumberToAddを名前付きの型をしたいですか?

関連する問題