4

一見非常に単純な問題に取り組んでいます。MIDL コンパイラを使用して.tlb、ファイルからタイプ ライブラリ (ファイル)を生成したいと考えてい.idlます。ただし、MIDL で.tlbファイルを生成することはできません。

これは私のFoo.idlです:

import "unknwn.idl";

[object, uuid(400075B9-4BD6-45A5-B8B7-9DA0CF7B9B13)]
interface IFoo : IUnknown
{
    HRESULT DoFoo([in] int arg, [out, retval] int *result);
}

これは、MIDL コンパイラを呼び出す方法です。

midl Foo.idl /tlb Foo.tlb

次の出力がコンソールに書き込まれます。

Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing .\Foo.idl
Foo.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\guiddef.h
guiddef.h

Foo.hMIDL コンパイラは、 、Foo_i.cFoo_p.c... の3 つのファイルを生成しますが、 Foo.tlb. 私は何かを誤解していますか、それともここで何が間違っていますか?

4

1 に答える 1

8

.idl ファイルはlibrary{}、タイプ ライブラリを生成する前にブロックを必要とします。このブロック内で、ライブラリ内に存在する必要がある型を宣言する必要があります。通常のライブラリcoclassにはライブラリ セクションに定義があるだけで、midl はコクラスが使用するインターフェイスを自動的に挿入します。

インターフェイスだけを取得するには、ライブラリ ブロック内に移動する必要があります。

[
  uuid(34DC0E7C-37C1-41C1-B3FD-1755A0396308),
  version(1.0),
]
library MyLibrary
{
    importlib("stdole2.tlb");

    [object, uuid(400075B9-4BD6-45A5-B8B7-9DA0CF7B9B13)]
    interface IFoo : IUnknown {
        HRESULT DoFoo([in] long arg, [out, retval] long *result);
    };
};

ライブラリには独自の uuid、バージョン番号、および名前を使用してください。importlibブードゥー教は、IUnknown と GUID の定義がタイプ ライブラリにも埋め込まれないようにします。

于 2015-05-16T00:21:29.923 に答える