• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LinuxHunter
原创+技巧=无坚不摧
博客园    首页    新随笔    联系   管理    订阅  订阅
手动添加COM接口
如何手动添加COM接口

1.手动添加COM接口说明,例如

[
	object,
	uuid(A7A5F961-2D82-4A85-8919-F3E23B0764D5),
	dual,
	helpstring("IMySample 接口"),
	pointer_default(unique)
]
interface IMySample : IDispatch{
	[, helpstring("方法Test")] HRESULT Test();
};
 
2.手动添加COM类,例如
[
	uuid(2AC8F176-ACCB-46B0-B8B7-EBBDF06C415A),
	version(1.0),
]
library TestComLib:
{
	importlib("stdole2.tlb");
	[
		uuid(0DFAFCD4-2343-4AC1-9ED8-B1C773E05A31),
		helpstring("MySample Class")
	]
	coclass MySample                 //添加COM类
	{
		[default] interface IMySample;
	}
};
 
3.添加MySample.rgs脚本,内容类似如下:
HKCR
{
	NoRemove CLSID
	{
		ForceRemove {0DFAFCD4-2343-4AC1-9ED8-B1C773E05A31} = s 'MySample Class' //COM类GUID
		{
			ForceRemove Programmable
			InprocServer32 = s '%MODULE%'
			{
				val ThreadingModel = s 'Both'
			}
			TypeLib = s '{2AC8F176-ACCB-46B0-B8B7-EBBDF06C415A}' //类型库GUID
			Version = s '1.0'
		}
	}
}
4.在resource.h文件中添加如下行:
#define IDR_MYSAMPLE    102

5.打开.rc文件,添加如下行:
IDR_MYSAMPLE REGISTRY "MySample.rgs"
 
6.在实现COM类的类体中加入如下红色标记的代码:
class ATL_NO_VTABLE CMySample :
	public CComObjectRootEx<CComMultiThreadModel>,
	public CComCoClass<CMySample, &CLSID_MySample>,
	public IDispatchImpl<IMySample, &IID_IMySample, &LIBID_TestComLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
	CMySample()
	{
	}

	DECLARE_REGISTRY_RESOURCEID(IDR_MYSAMPLE)


	BEGIN_COM_MAP(CMySample)
		COM_INTERFACE_ENTRY(IMySample)
		COM_INTERFACE_ENTRY(IDispatch)
	END_COM_MAP()



	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct()
	{
		return S_OK;
	}

	void FinalRelease()
	{
	}

public:
	STDMETHOD(Test)()
	{
		return S_OK;
	}


};

OBJECT_ENTRY_AUTO(__uuidof(MySample), CMySample)
 
posted on 2011-01-05 22:40  LinuxHunter  阅读(1896)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3