Articles of 操作互操作

何时以及为何使用CoLoadLibrary?

CoLoadLibrary()的说明与LoadLibraryEx()几乎相同 – 将DLL加载到进程中。 COM类创build函数 – CoCreateInstance()和CoGetClassObject() – 都会将必要的DLL加载到进程中。 那么为什么CoLoadLibrary()首先需要使用,应该如何使用呢?

在同一台机器上创build对象时,CoCreateInstance()和CoGetClassObject()有什么区别?

我明白,CoCreateInstance查找给定的类id的COM服务器,创build该id的对象实例,并从该对象实例中检索一个接口。 CoGetClassObject()为类IDfindCOM服务器,为该类的id创build类工厂的一个实例,并检索那个类的工厂接口,然后可以用它来创build实际的对象。 当在同一台机器上创build对象时,这些函数还有什么区别? 他们是否以相同的方式工作,但只能导致在完全相同的COM服务器中调用不同的代码?

COM如何select如何编组接口?

就我所知,有三种方法可以在COM中实现编组: typelib编组 代理/存根编组 实现对象的IMarshal 现在组件消费者 (用户)如何select使用哪一个? 它是自己决定的,使用首选的方式,还是它调用一些内置的function,它解决了这个问题呢? 我目前遇到以下情况:我的组件实现了一个自定义接口ICustomInterface ,也是由另一个公司的组件实现的。 我的组件没有一个typelib,并没有实现IMarshal。 系统registry包含具有代理/存根的GUID的HKCR \ Interface {uuidof(ICustomInterface)} \ ProxyStubClsid32密钥,该代理/存根可以跟踪到该另一个公司提供的库。 现在,当我的组件使用者初始化我的组件时,它会调用QueryInterface(),从我的组件中请求IMarshal,当返回E_NOINTERFACE时它什么也不做。 这是为什么 – 为什么不从其他公司的代理/存根库踢?