none
【VC++】如何用CoCreateInstance初始化IServiceProvider? RRS feed

  • 问题

  •  IServiceProvider *pIServiceProvider;
     HRESULT hr = CoCreateInstance(这里我应该填什么?, NULL, CLSCTX_INPROC_SERVER,IID_IServiceProvider, (void**)&pIServiceProvider);

    难道不应该用这种初始化方式吗?

    2015年11月7日 17:59

全部回复

  • 应该填CLSID

    IServiceProvider是接口不是可以创建的对象。



    Visual C++ MVP

    2015年11月7日 21:52
    版主
  • 其实我知道应该填写CLSID,但是具体应该填什么?难道COM不能这么用吗?望阁下解答。
    2015年11月8日 4:30
  • 填你要创建的对象的CLSID。不知道你想怎么用,COM就这一种用法。


    Visual C++ MVP

    2015年11月8日 4:52
    版主
  • 那您能告诉我包含IServiceProvider的对象的CLSID到底是什么吗?

    之前,我要创建MsHTML中IElementBehaviorFactory,但是一直不知道它的CLSID到底是什么。

    2015年11月8日 5:08
  • IElementBehaviorFactory是给IServiceProvider::QueryService查询的,不是给你CoCreateInstance的。

    你的MSHTML的ActiveX容器会传递给MSHTML一个你写的具有IOleClientSite接口的对象(这个对象同时应该实现IServiceProvider::QueryService,在服务ID为SID_SHTMLElementBehaviorFactory的时候返回一个IElementBehaviorFactory的接口。

    对于MFC 7或者之后的版本来说,要替换默认的COleClientSite对象的话,可以重载CWnd::CreateControlSite,参考CDHTMLDialog类的源代码中IDocHostUIHandler相关的部分。



    Visual C++ MVP



    2015年11月8日 5:51
    版主
  • 也就是说,这个IServiceProvider需要我自己用COM函数进行实现?
    2015年11月8日 11:39
  • 呃,上面提到的接口的实现都是要你自己写的,COM本身没有什么函数可以帮你的忙。


    Visual C++ MVP

    2015年11月8日 14:30
    版主
  • 我大概明白了。

    如果我想要用MsHTML,就必须先在自己的程序里写一些接口(难道连IUnknown都必须自己写吗?),包括IServiceProvider。然后用IServiceProvider查找SID_SElementBehaviorFactroy服务,让系统返回IElementBehavior接口,这样就算正式应用了MsHTML了。

    请问大概是这样的吗?实现那些接口要用到Windows的一些基础函数?

    2015年11月8日 15:15
  • 理论上IUnknown也要自己写的。不过MFC和ATL有内建IUnknown支持。

    IServiceProvider是你写来给MSHTML查询宿主有什么功能用的。

    接口具体怎么实现没有规定,得看你的项目需求。这些扩展性接口都是你要给MSHTML里加你自己的功能的时候用的。



    Visual C++ MVP

    2015年11月8日 16:33
    版主