3

C++ ライブラリがあり、そのライブラリの COM インターフェイスを自動生成しています。そのため、IDL ファイルを自動生成したところ、すべて正常に動作していました。しかし、COM にさらに多くのインターフェイスが追加されると、エラーが発生し始めました。

1> Total Format String size = 69336
1> midl : error MIDL2379: the compiler reached a limit for a format string representation. See documentation for advice.

VS2008 と VS2010 の両方でこのエラーが発生しています。

この問題を解決する方法を教えてください。インターネット全体を検索しましたが、適切な解決策が見つかりませんでした。Microsoft Connectで報告されたバグが 1 つありますが、ステータスはクローズされています。彼らが提案する回避策の 1 つは、IDL ファイルを分割することです。これは、私の場合は不可能であり、インターフェイスが相互に依存しているためです。

サンプルの IDL ファイルSampleGenerated.idlをアップロードしました

midl へのコマンド ラインは次のとおりです。

/W1 /nologo /char signed /env win32 /h "SampleGenerated_h.h" /tlb "Debug\SampleGenerated.tlb"
4

1 に答える 1

0

こんな感じで、やっとできました…

最初に各インターフェイスを個別の IDL ファイルに分割します

Interface1.idl

Interface Interface2; // forward declaration

#ifndef __Interface1_IDL_FILE_
#define __Interface1_IDL_FILE_
import "AllIDLInterface.idl";
[
    object,
    uuid(66006A2F-B777-4e2f-A0CA-D5BE00000015),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface Interface1 : IUnknown{
HRESULT getInterface2([out, retval]Interface2** outVal )
};
#endif

Interface2.idl

Interface Interface1;// forward delcarations

#ifndef __Interface2_IDL_FILE_
#define __Interface2_IDL_FILE_
import "AllIDLInterface.idl";

[
    object,
    uuid(66006A2F-B777-4e2f-A0CA-D5BE00000015),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface Interface2 : IUnknown
{
HRESULT getInterface1([out, retval]Interface1** outVal )
};
#endif

すべてのインターフェイス ファイルのインポートを含む別の IDL ファイルAllInterface.idlを作成します。

import Interface1.idl
import Interface2.idl

次に、TLB ファイルを作成するmain.idl

import AllInterface.idl;

ここでの唯一の欠点は、インターフェイスの C++/C ヘッダー ファイルを生成する場合、各 IDL ファイルを個別にコンパイルする必要があることです。

于 2013-10-30T08:23:28.303 に答える