問題タブ [midl]
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.
visual-studio - MIDLは、/envwin32と/envwin64に対して同じファイルを生成します
Visual Studioでは、foo.idlをコンパイルすると、MIDLはfoo_p.cにプロキシ情報を生成します。
残念ながら、Win32ファイルとx64ファイルの場合、同じファイル名を使用します。Win32の場合、ファイルは次で始まります。
x64の場合、ファイルは次で始まります。
Win32用にビルドしてすぐにx64用にビルドすると、foo_p.cファイルは置き換えられません。つまり、プロジェクトはリンクに失敗します。
アーキテクチャが間違っている場合にfoo_p.cファイルを削除するビルド前のイベントを試してみましたが、VSはそのステップを実行することすらしません。
1つの構成を構築してから、もう1つの構成を構築できるようにするには、どうすればよいですか?
idl - typedef が不明な型を使用している場合、Microsoft MIDL はエラーを報告しませんが、これはバグですか?
何か不足しているかどうかを知りたい:
次のコマンドで test.idl をコンパイルすると:
私はこの出力を得る
そして、間違った test.h (このメッセージの下部) を受け取ります。
未知の foo 型は静かに破棄されました。
「foo is an unknown type」というエラー メッセージが表示されると思っていましたが、間違っていますか?
MIDL コマンドに特定の引数を渡す必要はありますか?
MIDL コンパイラ バージョン 7.00.0500 でも同じ結果が得られました。
visual-c++ - midl.exe 6 と midl.exe 7 からの異なる出力
MSVC プロジェクトを VS 2005 から VS 2008 に変換しようとしています。RPC に使用されるヘッダーとスタブを出力する IDL ファイルが含まれています。VS 2005 プロジェクトは、MIDL.exe バージョン 6.00.0366 を使用します。VS 2008 プロジェクトは、MIDL.exe バージョン 7.00.0500 を使用します。
問題は次のとおりです。MIDL v6 は、サーバー コードに実装する次のプロトタイプを出力します。
同じコマンド ラインで MIDL v7 を実行すると、次のプロトタイプが出力されます。
既存のすべての実装に handle_t パラメーターを追加する必要はありません。(さらに、しばらくの間、VS 2005 でコンパイルするための実装が必要です。)
質問: MIDL.exe v7 で v6 と同じ RPC サーバー プロトタイプを出力するにはどうすればよいですか?
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++ - COM サーバーは ([in, out] CACLSID * arg) を再割り当てできますか?
次のように宣言された COM インターフェイス メソッドを使用します。
マーシャリングに関して、サーバーはカウントされた配列を再割り当てできますか? (あると思いますが、今は定かではありません)
現在の実装は既存の ID を置き換えるだけですが、新しいインターフェイスを導入せずにより多くのアイテムを返す可能性がある (契約を破らない) 変更を実装したいと思います。
[編集] CACLSIDはすでに配列であり、カウントとポインターを含んでいることに注意してください。
c++ - COM API - ポインター引数に「NULL」を渡すことができませんでした
COM API foo があります。IDL は次のようになります。
この関数を使用するとfoo(0,NULL);
エラーが発生します - NULL 引数が渡されました。これを回避する方法はありますか?
com - IDL での作成不可能なコクラスの目的は何ですか?
IDL で次のような作成不可能なコクラスを宣言する理由は何ですか?
とにかく、そのようなクラスはCOMに登録されないということです。IDL ファイルと、その IDL ファイルをコンパイルすることによって生成されるタイプ ライブラリでそれを言及する理由は何ですか?
c++ - midl で各インターフェイスを個別の .h に生成する方法はありますか?
idl ファイルから生成された抽象インターフェイスを継承するオブジェクトがたくさんあります。これらのインターフェイスを使用する各オブジェクトには、同じファイル interfaces.h が含まれます。このファイルには、idl インターフェイスにマップされる C++ で生成されたすべての抽象クラスが含まれています。
何かをinterfaces.idlに変更するたびに、interfaces.hが変更されるため、これに依存するすべてのクラスを再構築する必要があります。midl に各抽象クラスを独自の .h で生成するように指示するフラグまたは何かがありますか?
relative-path - MIDL に修飾パスの追加のインクルード ディレクトリを検索させるにはどうすればよいですか?
更新: Microsoft へのサポート コールを開いてからわずか 6 か月後に拒否され、彼らはそれがバグではないと主張しました (ドキュメントには、見られた動作が正しいものではないと明示的に記載されていないため)。彼らはDCRを拒否し、過去 10 年間苦情を聞いていないため、これは明らかに一般的な使用例ではないと述べました。
これは呼びかけです。同じ問題が発生した場合は、Microsoft にサポート コールを開いて、問題を修正する必要があることを Microsoft に知らせてください。Chrome のソース コードでこのコメントを見つけたので、少なくとも誰かが同じ問題に遭遇したことを知っています。
#
.idl ファイルの構築。
#
これは完全な混乱です。MIDL は $OPEN_DIR から実行する必要があり
#
ます。そのインクルード パスを "ui/ie/bla.idl" のような相対パスに適用するのは愚かすぎるためです
#
(現在のディレクトリのみを検索します)。
#
したがって、相対インクルード パスと出力ファイルを修正するには、フープをジャンプする必要があります。
元の質問:
次のファイル構造があります。
C:\first\Foo.idl
C:\second\Bar.idl
Bar.idl
次の行が含まれています。
からコンパイルするときにmidlをコンパイルするにはどうすればよいですか?Bar.idl
C:\second
Foo.idl
直接インポートした場合(指定せずにfirst/
) first
、追加のインクルード ディレクトリとして指定するだけで十分です ( midl /I c:\first Bar.idl
)。Foo.idl
C:\
または、 ( )からコンパイルした場合midl second\Bar.idl
も問題ありません。
問題はC:\second
、コマンド ラインを使用して内部からコンパイルするとmidl /I C:\ Bar.idl
、次のコンパイル エラーが発生することです。
c1 : 致命的なエラー C1083: ソース ファイルを開けません: 'first\Foo.idl': そのようなファイルまたはディレクトリはありません
midlは、指定された追加のインクルード ディレクトリのいずれかではなく、現在のディレクトリに相対する場合にのみ相対パスを検索し、追加のインクルード ディレクトリを修飾されていないファイル名にのみ使用する場合にのみ、相対パスを検索するように見えます。この動作はimport
キーワードに固有です。結果を使用include
することは期待どおりです。
ローカル マシンにファイルがある場合はmidlがそのバージョンを取得し、それ以外の場合はサーバーからファイルを取得するように、2 つの異なる追加のインクルード ディレクトリを追加できるようにしたいと考えています (そのためchdir
、ルート フォルダーへの ing はオプションではありません)。 )。
これを回避する方法はありますか?