問題タブ [idl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 再コンパイルせずにCORBAインターフェイスを変更する
既存のサーバーのCORBAインターフェイスにメソッドを追加したいと思います。すべてのクライアントを再コンパイルする必要がありますか?
TAOを使用しています。
vb6 - MAPI-MIME 変換用 IDL の作成
IConverterSession インターフェイスの IDL を作成しようとしていますが、MIMETOMAPIメソッドの定義に混乱しています。パラメーターを [out] として指定しLPMESSAGE pmsg
ますが、コメントには、読み込まれる MAPI メッセージへのポインターが示されています。
関数がMAPIメッセージオブジェクトを割り当ててポインターを設定するかどうかは不明ですが、その場合、それはMESSAGEのポインターへのポインターであってはなりませんか? または、呼び出し元のコードが既にメッセージ オブジェクトをインスタンス化していると予想される場合、[in] ではなく [out] とマークされているのはなぜですか?
最終的に、このインターフェイスは VB6 コードから使用されるため、[in] または [in, out] のいずれかである必要がありますが、使用した IDL であるかどうかを知る必要があります。
また
com - タイプ ライブラリに IDL 列挙が表示されない
MS ATL ライブラリを使用して記述された COM オブジェクトがあります。IDL で多数の列挙型を宣言しましたが、MS COM オブジェクト ビューア ツールを使用してタイプ ライブラリを表示すると、列挙型が表示されません。問題は、欠落している列挙型が実際にはどの COM メソッドによってもパラメーターとして使用されていないことです。これらの列挙型を強制的に表示するにはどうすればよいですか?
たとえば、IDL では次のようになります。
問題の列挙型はどのメソッドでも直接使用されていませんが、オブジェクトを使用するすべての人にとって有用ですが、エクスポートすることはできません。
誰もこれを見たことがありますか?
c++ - __REQUIRED_RPCNDR_H_VERSION__
IDL からヘッダー ファイルを作成します。IDL ファイルは、Visual C++ 2005 でコンパイルされています。生成されたヘッダー ファイルには #define REQUIRED_RPCNDR_H_VERSION 475 が含まれます。
rpcndr.h が含まれている Visual Studio 2003 でこのヘッダー ファイルを使用しようとしました。
{
#define RPCNDR_H_VERSION ( 450 ) // そして
#if ( RPCNDR_H_VERSION < REQUIRED_RPCNDR_H_VERSION )
}
450<475 なので、コンパイル時エラーが発生します。Visual Studio 2003 でヘッダー ファイルを使用する方法はありますか。idl ファイルのコンパイル設定を変更する必要がありますか。
PS: Visual C++ 2005 のみで idl ファイルをコンパイルする必要があります。(VS 2003 でコンパイルするという選択肢はありません)。
c# - C# から C スタイルの配列を受け取る関数の IDL 宣言 (C++)
C++ で記述されたいくつかの COM インターフェイスと C# フロント エンドで構成された既存のコード ベースを使用しています。追加する必要がある新しい機能がいくつかあるため、COM 部分を変更する必要があります。ある特定のケースでは、(C# から割り当てられた) 配列をコンポーネントに渡して入力する必要があります。
私がやりたいことは、次のような C# からメソッドに int の配列を渡すことができるようにすることです。
作業中のいくつかのレンチ:
- C++/CLI またはマネージ C++ は使用できません (この場合、COM は廃止できます)。
- C# 側は /unsafe でコンパイルできません (Marshal の使用は許可されています)。
COM インターフェイスは C# 部分でのみ使用されます (使用されることはありません)。そのため、他の COM コンシューマとの相互運用性についてはあまり関心がありません。32 ビットと 64 ビットの間の移植性も問題ではありません (すべてが 32 ビット マシンからコンパイルおよび実行されるため、コード ジェネレーターはポインターを整数に変換します)。最終的には C++/CLI だけに置き換わる予定ですが、それはまだ先の話です。
私の最初の試み
次のようなものです:
出力 TLB の定義は次のとおりです (妥当なようです)。
これはC#によって次のようにインポートされます(あまり合理的ではありません):
私が使用できるもの
.../unsafe でコンパイルできないことを除いて。
この時点で
私は使っている:
次のようにインポートします。
そして、私はそれを次のように使用する必要があります:
これはうまくいきます...しかし、もっとクリーンな方法を見つけたいです。
それで、質問は
この場合の TLB ジェネレーターからの C# インポートに適した IDL 定義はありますか? そうでない場合、もう少し安全にするために C# 側で何ができるでしょうか?
c# - クライアントとサーバーの両方に C# で C++ COM インターフェイスを使用する
C# コードの一部を、COM を介してあらゆる種類の実装と対話させる必要があります。
この統合をユーザーが簡単に行えるようにするために、相互作用するインターフェイスを IDL に (関連する既存の DLL の一部として、ただしコクラスや実装は含めずに) 含め、Tlbimp を実行して型定義を作成することで C# コードに組み込みました。
C# を実装し、Windows レジストリ情報に基づいて COM オブジェクトを作成し、そのオブジェクトを必要なインターフェイスにキャストしました。
次に、別のプロジェクトでインターフェイスの C# 実装を作成し、登録しました。メイン プログラムはテスト COM オブジェクトを正しく作成しますが、インターフェイスへのキャストに失敗します (C# 'as' を使用すると null オブジェクトを取得し、明示的なキャストの InvalidCastException を取得します)。
インターフェイスがテストオブジェクトによって実装されていると識別されない理由を誰かが示唆できますか?
これは IDL のインターフェイス定義です (VS 2005 で C++ でコンパイル):
これは、Tlbimp によって C# 用に作成されたスタブです。
これはメインの C# コードの一部であり、その ProgID によって COM オブジェクトを作成し、それを IScriptGenerator インターフェイスにキャストします。
これは C# コードの実装で、機能していることをテストします (実際には機能していません)。
idl - typedef が不明な型を使用している場合、Microsoft MIDL はエラーを報告しませんが、これはバグですか?
何か不足しているかどうかを知りたい:
次のコマンドで test.idl をコンパイルすると:
私はこの出力を得る
そして、間違った test.h (このメッセージの下部) を受け取ります。
未知の foo 型は静かに破棄されました。
「foo is an unknown type」というエラー メッセージが表示されると思っていましたが、間違っていますか?
MIDL コマンドに特定の引数を渡す必要はありますか?
MIDL コンパイラ バージョン 7.00.0500 でも同じ結果が得られました。
com - IDL を使用した純粋な基底クラスの定義
何からも派生しない IDL でインターフェイスを定義すると、MIDL プリコンパイラはそのように警告します (Visual C++ 2008):
警告 MIDL2271: [オブジェクト] インターフェイスは、IUnknown などの別の [オブジェクト] インターフェイスから派生する必要があります (...)
また、IUnknown から派生していない別のインターフェイスからインターフェイスを派生させた場合、MIDL は失敗します:
エラー MIDL2257: ルート インターフェイスとして使用できるのは IUnknown のみです (...)
さて、私の質問: これは COM または MIDL プリコンパイラの制限ですか?
私は最近 D3D10 ヘッダーを見てきましたが、d3d10.h は明らかに IDL を使用して生成されています (MIDL はこの効果にコメントを追加します)。そして、すべてのインターフェイスは何らかの形で IUnknown から派生しています。
ただし、ペリフェラル ヘッダー (d3d10shader.h、d3d10effect.h など) には手動で定義された COM インターフェイスが含まれており、その一部はここで説明する警告またはエラーをトリガーします。これらの制限を回避するために、手動で定義する必要があったとしか思えません。
私は正しいですか?MIDL によって純粋なインターフェイスが妨げられるのはなぜですか?
c++ - 事前定義されたIDLファイルにタイプ定義がありません
まず、
プレーンC++を使用し、ATLを使用せずに、MFCはCOMオブジェクトインターフェイスを使用しようとします。
oleview(OLE / COMオブジェクトビューア)の使用-IDLコードを設計するために使用されます。
この段階では、MIDLコンパイラを使用して、次のものを作成しようとして問題が発生しています。
cmd行の構文:
midl / nologo / env win32 /tlb"。\S8_.tlb"/h"。\S8_.h"/iid"。\S8_i.c"S8.idl
- 対応する.TLB(タイプライブラリ)
- A .H(ヘッダー)
- IID定義にはファイル(* _i.c)が含まれます
- プロキシ(* _p.c)
MIDLコンパイラエラー:
S8.IDL(513):エラーMIDL2025:構文エラー:「S8SimObject」の近くに型指定が必要です
c++ - C++ コンポーネントの OLE ビューによって作成された IDL の編集
これを行う際に考慮すべきことは次のとおりです。
- 何を削除/操作/追加するか
よろしく