1. 我从dll/tlb中导入,但是看源代码就糊涂了,constructor中并没有创建com对象的代码,准确的说,生成的wrap class的constructor根本就是空的,而父类COleDispatchDriver也没有什么创建操作,而且所有生成的wrap class都是这样,那实际的com对象从何而来呢?其他的.h文件中也没见有修改的痕迹...2. mfc exe application, sdi方式, document/view support、automation都打开了,生成的exe是standalone exe还是只在程序内部才能访问程序内定义的接口?抱歉,还没入门,不知道如何区分。

解决方案 »

  1.   

    1包装类应该只是接口的包装,具体的com对象是组件自己创建的(实现组件的dll或者exe),外部不需要知道细节。
    2是可以独立运行的程序,但支持automation使得他还向操作系统开放了其它接口,使得客户可以通过这些接口来使用它的功能。
      

  2.   

    COleDispatchDriver::CreateDispatch
    COleDispatchDriver::AttachDispatch
      

  3.   

    关于1. 即便com对象是自己创建,但是wrap class总归要有什么方法与其沟通而获得dispatch接口吧?所有的wrap class都是空constructor,也没有传递什么类型信息或者是riid给父类COleDispatchDriver啊。这部分不在wrap class内,com library怎么区分各接口?关于2. 我知道我可以分派接口给别的组件使用,但如果我的程序没有执行,别的程序还能使用这些接口吗?或者说,在并非我分派接口的前提下,其他程序能够通过类似别的组件的创建方法来创建我的exe里的com对象呢?
      

  4.   

    1.不是很清楚,是不是注册了全局的东西?2.调CoCreate之后查注册表找到LocalServer32,加载进程并传入命令行参数Embbeding,exe此时有义务注册所有类厂,COM库创建对象,查询接口,调整后返回。
    还可以参考参考这个:
    http://expert.csdn.net/Expert/topic/2454/2454342.xml?temp=.9821894
      

  5.   

    大致明白了。1 是需要自己调用CreateDispatch或者AttachDispatch来初始化,所以自身没有这些信息,不过riid和progid都是随手可得的东西,为什么不直接在wrap class里面生成呢?为了灵活性?2 大致也明白了。传入参数Embbeding则在InitInstance的ProccessCommand里面执行相应处理吧?  但我似乎没有找到mfc exe有注册过什么ProgID啊,这样也能找到并调用吗?
    大致解决问题了,明天结贴。
      

  6.   

    不是注册ProgID,是注册类场。他会告诉COM库一串CLSID和对应的类场指针。