note : COM Tips
发布日期:2021-06-30 22:04:00 浏览次数:2 分类:技术文章

本文共 3740 字,大约阅读时间需要 12 分钟。

查看 _uuidof的值

LPOLESTR lpolestr;    StringFromCLSID(__uuidof(Wzd), &lpolestr);    wprintf_s(L"%s", lpolestr);    CoTaskMemFree(lpolestr);

CreateInstance 入参

IWzdPtr pPtr;    /// 接口CreateInstance 入参1 为接口类的UUID, helpstring("Wzd Class")	HRESULT hr=pPtr.CreateInstance(__uuidof(Wzd));	if (FAILED(hr))	{		_com_error err(hr);		AfxMessageBox(err.ErrorMessage());		return;	}	pPtr->Method(...);

客户端调用COM DLL 接口中的方法

如果在创建COM接口实例时,  返回"类未注册".
需要检查一下注册的COMDLL和客户端EXE是否都为一个平台(x86/x64)
如果是大工程,有可能选了同样的设置(Release/x64), 但是具体的工程生成的设置还是x86的.
这个环境问题,还是挺隐蔽的~
比较好的方法是,单独打开每一个子工程,创建确认各种平台的编译设置.
在总工程的编译设置中,选择,确认每个子工程的编译设置.
某人因为这个环境问题,耽误了2天时间~
/// 用oleviewer看到的接口信息/// C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\x64\/// OleView.Exe// coclass AtlTest2057A// {38715ED2-0942-4B25-BAC2-3BB04D623A23}// IAtlTest2057A// uuid(B033480A-4BDD-402B-A579-0505F595EA94),#define UUID_coclass_AtlTest2057A L"{38715ED2-0942-4B25-BAC2-3BB04D623A23}"#define UUID_IAtlTest2057A L"{B033480A-4BDD-402B-A579-0505F595EA94}"/// @note /// X64版的COM组件, 必须编译成X64版的客户端访问, 使用X64版的OleViewer查看/// X86版的COM组件, 必须编译成X86版的客户端访问, 使用X86版的OleViewer查看/// 否则访问接口时,显示"类未注册"void CtestMfcDlgDlg::OnBnClickedButtonTestMyCom(){    HRESULT             hr = S_FALSE;    CLSID               clsIDCoClass;    CLSID               clsIDCoInterface;    IAtlTest2057A *     pInterface = NULL;    hr = CoInitialize(NULL);    if (FAILED(hr))    {        ShowHresultError(hr);        goto _OnBnClickedButtonTestActiveDeskTop_END;    }    /// 可以用OleViewer的结果, 来确定是否能访问到正确的CLSID, IID    hr = CLSIDFromString(UUID_coclass_AtlTest2057A, &clsIDCoClass);    if (FAILED(hr))    {        _com_error err(hr);        AfxMessageBox(err.ErrorMessage());        goto _OnBnClickedButtonTestActiveDeskTop_END;    }    hr = IIDFromString(UUID_IAtlTest2057A, &clsIDCoInterface);    if (FAILED(hr))    {        _com_error err(hr);        AfxMessageBox(err.ErrorMessage());        goto _OnBnClickedButtonTestActiveDeskTop_END;    }    // Create a COM object    hr = CoCreateInstance ( clsIDCoClass,        NULL,        CLSCTX_INPROC_SERVER,///< 对于COM DLL 来说,是这个标记        clsIDCoInterface,        (void**) &pInterface);    if (FAILED(hr))    {        ShowHresultError(hr);        goto _OnBnClickedButtonTestActiveDeskTop_END;    }    /// use pInterface do task ...    pInterface->Release();_OnBnClickedButtonTestActiveDeskTop_END:    CoUninitialize();}/// 如果组件注册正常, 将COM接口定义文件直接包含进工程/// e.g. AtlTest2057_i.h AtlTest2057_i.c/// 直接使用组件的CLSID和IID, 比较方便/// e.g. CLSID_AtlTest2057A, IID_IAtlTest2057Avoid CtestMfcDlgDlg::OnBnClickedButtonTestMyCom1(){    HRESULT             hr = S_FALSE;    IAtlTest2057A *     pInterface = NULL;    hr = CoInitialize(NULL);    if (FAILED(hr))    {        ShowHresultError(hr);        goto _OnBnClickedButtonTestActiveDeskTop_END;    }    // Create a COM object    hr = CoCreateInstance ( CLSID_AtlTest2057A,        NULL,        CLSCTX_INPROC_SERVER, ///< 对于COM DLL 来说,是这个标记        IID_IAtlTest2057A,        (void**) &pInterface);    if (FAILED(hr))    {        ShowHresultError(hr);        goto _OnBnClickedButtonTestActiveDeskTop_END;    }    /// use pInterface do task ...    pInterface->Release();_OnBnClickedButtonTestActiveDeskTop_END:    CoUninitialize();}void ShowHresultError(HRESULT hr){    _com_error err(hr);    AfxMessageBox(err.ErrorMessage());}

add .h for IActiveDesktop

#include 
// MFC 核心组件和标准组件#include
// MFC 扩展/// This has to be included here, since IActiveDesktop uses/// constants from this header. See Q196342 for more.#include
///< add here to use IActiveDesktop#include
// MFC 自动化类

Shell SDK Samples

http://msdn.microsoft.com/en-us/library/windows/desktop/dd940376(v=vs.85).aspx

转载地址:https://lostspeed.blog.csdn.net/article/details/12305133 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:stl : array
下一篇:experiment : use class member function pointer

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月08日 18时45分01秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章