0

ここに簡単なテストがあります。関数ポインター型 FN_t は ITest::Test と ITest::Test2 で 2 回表示されます。

import "oaidl.idl";
import "ocidl.idl";


typedef void(* FN_t)();


[
    uuid(f5d5eb17-45c7-4cce-a176-9ed2e1083d2a),
    object,
    local,
    pointer_default(unique)
]
interface ITest : IUnknown {
    HRESULT Test(FN_t pfn);
    HRESULT Test2(FN_t pfn); // !error!
}

[
    uuid(04f887d2-7412-497a-8189-72e710484bfa)
]
library TestLib {
    importlib("stdole2.tlb");

    [
        uuid(072f49e3-b94c-4d94-a368-ee72db579600)
    ]
    coclass Test {
        [default] interface ITest;
    }
}

エラー メッセージ: midl\oleaut32.dll: エラー MIDL2020: タイプ ライブラリの生成エラー: SetFuncAndParamNames が失敗しました: __MIDL____MIDL_itf_test_0000_00000000 (0x8002802C)

!error! をコメントすることによって 行、MIDL はうまく機能します。では、なぜ、どのようにコードを機能させるのでしょうか?

================================================== ================================

自分で答えてもいいと思います。

単一の ITest::Test メソッドの場合。生成された typelib のインターフェイスは次のとおりです。

    interface ITest : IUnknown {
        void _stdcall __MIDL____MIDL_itf_test_0000_00000000();
        HRESULT _stdcall Test(ITest* pfn);
    };

タイプライブラリは、関数ポインタの型が何であるかを認識していないようです。

次に、wire_marshal 属性を追加すると機能します。

import "oaidl.idl";
import "ocidl.idl";

typedef [unique] void *wirePointer;
typedef [wire_marshal(wirePointer)] void(__stdcall *FN_t)();

[
    uuid(f5d5eb17-45c7-4cce-a176-9ed2e1083d2a),
    object,
    local,
    pointer_default(unique)
]
interface ITest : IUnknown {
    HRESULT Test(FN_t pfn);
    HRESULT Test2(FN_t pfn); // ok!!!
}

[
    uuid(04f887d2-7412-497a-8189-72e710484bfa)
]
library TestLib {
    importlib("stdole2.tlb");

    [
        uuid(072f49e3-b94c-4d94-a368-ee72db579600)
    ]
    coclass Test {
        [default] interface ITest;
    }
}
4

0 に答える 0