2

これは私の IDL ファイルです。IFrame はデュアル インターフェイスであり、IDispatch と IUnknown の両方を継承します。

[
    object,
    uuid(C5AD0517-37FC-479C-9C7A-A063B17E4A2E),
    dual,
    nonextensible,
    pointer_default(unique)
]
    interface IFrame : IDispatch{
};
[
    uuid(F7D50952-4AF1-491B-B0AA-35083AEFA998),
    version(1.0),
]
library bdsCOMLib
{
    importlib("stdole2.tlb");
    [
        uuid(9C2E7E2D-A39C-4FE7-BEEB-3BF65F9D4C05)      
    ]
    coclass Frame
    {
        [default] interface IFrame;
    };
};

そして、これは IFrame を実装すると想定される CFrame クラスの宣言です。

class ATL_NO_VTABLE CFrame :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CFrame, &CLSID_Frame>,
public IDispatchImpl<IFrame, &IID_IFrame, &LIBID_bdsCOMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
    public:
        CFrame()
        {
        }

    DECLARE_REGISTRY_RESOURCEID(IDR_FRAME)


    BEGIN_COM_MAP(CFrame)
        COM_INTERFACE_ENTRY(IFrame)
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }
};
OBJECT_ENTRY_AUTO(__uuidof(Frame), CFrame)

COM サーバーが登録され、VBA で Frame オブジェクトを使用すると正常に動作しますが、早期バインディングによって動作します。このオブジェクトを VBScript で使用したいので、レイト バインディングが必要です。

ただし、遅延バインディングは実行できません。状況を調べたところ、ATL (および IDispatchImp クラス) が IDispatch に必要なすべての実装を行っているようです。これにより、オートメーション ツール (VBScript など) でオブジェクトを使用できるようになります。

ただし、実際には、スクリプトは「Active X コントロールを作成できません」というエラーを出します。アーリー バインディングを試してみると、VBA でも同じです。

私は何を間違っていますか?Windows 7 64 ビットで Visual Studio 2012 を使用していますが、COM サーバーは 32 ビットです (システムに登録されています)。

4

0 に答える 0