Lyangyangyang 2019-01-17 00:10 采纳率: 0%
浏览 1089

ATL COM组件开发 遇到 ATL::CComContainedObject不能实例化抽象类

idl定义类型库

// ATLProject2.idl : ATLProject2的 IDL 源
//

// 此文件将由 MIDL 工具处理以
// 产生类型库(ATLProject2.tlb)和封送处理代码。

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

import "Application.idl";
import "Document.idl";

[
    object,
    uuid(a817e7a2-43fa-11d0-9e44-00aa00b6770a),
    dual,   
    pointer_default(unique)
]
interface IComponentRegistrar : IDispatch
{
    [id(1)] HRESULT Attach([in] BSTR bstrPath);
    [id(2)] HRESULT RegisterAll();
    [id(3)] HRESULT UnregisterAll();
    [id(4)] HRESULT GetComponents([out] SAFEARRAY(BSTR)* pbstrCLSIDs, [out] SAFEARRAY(BSTR)* pbstrDescriptions);
    [id(5)] HRESULT RegisterComponent([in] BSTR bstrCLSID);
    [id(6)] HRESULT UnregisterComponent([in] BSTR bstrCLSID);
};

[
    uuid(67E2030B-5BFD-4DF7-8F5F-3FF1EF570E61),
    version(1.0),
    custom(a817e7a1-43fa-11d0-9e44-00aa00b6770a,"{13FEC681-4F90-427D-BA2F-CF36E0190E55}")
]
library ATLProject2Lib
{
    importlib("stdole2.tlb");
    [
        uuid(13FEC681-4F90-427D-BA2F-CF36E0190E55)      
    ]
    coclass CompReg
    {
        [default] interface IComponentRegistrar;
    };
    [
        uuid(8DAE4A62-CB32-4B6E-B3CF-2F6A8D3DC782)      
    ]
    coclass XApplication
    {
        [default] interface Application;
    };
    [
        uuid(D3E42200-28B3-4C47-BB4D-1480BF41477E)      
    ]
    coclass XDocument
    {
        [default] interface _Document;
    };
};


idl定义Applicatioin接口

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

import "Document.idl";

interface _Document;

[
    object,
    uuid(73E316A4-83F6-4C62-AB61-994BCF0103C5),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface Application : IDispatch {
    [propget, id(1)] HRESULT ActiveDocument([out, retval] _Document** pVal);
};

Application实现类定义

// XApplication.h : CXApplication 的声明

#pragma once
#include "resource.h"       // 主符号



#include "ATLProject2_i.h"
#include "Application.h"



#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif

using namespace ATL;


// CXApplication

class ATL_NO_VTABLE CXApplication :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CXApplication, &CLSID_XApplication>,
    public IDispatchImpl<Application, &IID_Application, &LIBID_ATLProject2Lib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CXApplication()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_XAPPLICATION)


BEGIN_COM_MAP(CXApplication)
    COM_INTERFACE_ENTRY(Application)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

public:



    STDMETHOD(get_ActiveDocument)(_Document* pVal);
};

OBJECT_ENTRY_AUTO(__uuidof(XApplication), CXApplication)

Document接口定义

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

import "Application.idl";

interface Application;

[
    object,
    uuid(2D856942-3E0B-4E57-AB8C-A504AA6F46CA),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface _Document : IDispatch {
    [propget, id(1)] HRESULT ActiveApplication([out, retval] Application** pVal);
};

Docuement类实现定义

// XDocument.h : CXDocument 的声明

#pragma once
#include "resource.h"       // 主符号



#include "ATLProject2_i.h"
#include "Document.h"



#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif

using namespace ATL;


// CXDocument

class ATL_NO_VTABLE CXDocument :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CXDocument, &CLSID_XDocument>,
    public IDispatchImpl<_Document, &IID__Document, &LIBID_ATLProject2Lib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CXDocument()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_XDOCUMENT)


BEGIN_COM_MAP(CXDocument)
    COM_INTERFACE_ENTRY(_Document)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

public:



    STDMETHOD(get_Application)(Application* pVal);
};

OBJECT_ENTRY_AUTO(__uuidof(XDocument), CXDocument)

  • 写回答

2条回答 默认 最新

  • smile_and_ovo 2022-04-24 11:41
    关注

    解决了吗

    评论

报告相同问题?

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看