赞
踩
打开Visual Studio 2022 新建ATL项目
设置短名称为Temp 其他的会自动填充
ProgID 设置为 项目名+“.”+短名称 (MyComTest.add )
文件类型以及其他默认就好点击完成
这里需要注意两个值
ProgID 是之后 vbs 及其他语言 调用组件所需要提供的名称
接口 add 为之后配置 idl 所需要找到的接口名
也可以切换到类视图,选中刚才添加的接口,如下,然后右键单击【添加】添加方法。
值得一提的是
__result 必须为指针用来进行返回
return 默认为 S_OK表示执行成功
[in] 表示 输入 [out] 表示输出 [retval] 表示作为返回值给外界
值得一提的是 retval 必须只能有一个 而且必须跟在out 后面
如果有void或自定义类型的变量编译不过,可以在最前面obiect前添加 local,
这里会看到生成报错
不用管他 打开我们的项目目录
MyComTest.dll 为 Com 组件本体
MyComTest.tlb 是之后C++ 调用Com所需要包含的文件
在当前目录以管理员身份打开CMD,输入如下代码,完成注册。
也可以将注册命令写到文本里,保存成bat格式运行。
在该解决方案下,添加C++控制台应用,在此工程中添加MyComTest工程中的两个头文件(MyComTest_i.c,MyComTest_i.h --主要用来查看CLSID和IID),在TestMyCom.cpp文件中添加引用
添加测试代码
运行
也可以这样实例化COM组件
/*说明 *功能:多字节转宽字节 *参数: str:多字节字符串 *返回: 宽字节字符串 */ static wchar_t* str2wstr(const char*str) { if(str == 0) { return 0; } wchar_t* _wchar; int len = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0); _wchar = new wchar_t[len + 1]; MultiByteToWideChar(CP_ACP,0,str,-1,_wchar ,len); _wchar [len] = '\0'; return _wchar ; } /*说明 *功能:初始化组件 *参数: Type:组件接口类型 *参数: comId:组件ID *返回: 组件接口对象指针:成功 NULL:失败 */ template<typename Type> static Type* InitCom(LPCOLESTR comId) { GUID clsid = GUID_NULL; HRESULT hr = CLSIDFromProgID(comId,&clsid); if(FAILED(hr))/*组件不存在*/ { return NULL; } IUnKnown* pCard = NULL; hr = ::CoCreateInstance(clsid,nullptr,CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pCard); if(nullptr == pCard)/*实例化组件失败*/ { return NULL; } Type *pCom; hr = pCard->QueryInterface(__uuidof(Type), (void**)&pCom); pCard->Release(); pCard = NULL; if(NULL == pCom)/*查询组件接口失败*/ { return NULL; } return pCom; } ---main()添加--- std::string odId = "MyComTest.add"; testAdd = InitCom<IAdd>(str2wstr(odId.c_str())); if(testAdd == nullptr)/*实例化组件失败*/ { return NULL; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。