首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >COM & CoGetClassObject()

COM & CoGetClassObject()
EN

Stack Overflow用户
提问于 2011-07-20 22:28:16
回答 3查看 3.5K关注 0票数 4

我对CoGetClassObject()有点小问题。

我有一个应用程序,它必须使用一些特定版本的DLL,但它们也存在于系统中,在较新的版本中。

所以我开始把CoCreateInstance()loadLibrary()挂在一起,我想这是很好的。问题是加载了两个版本中的DLL。

所以我认为CoGetClassObject()是一个问题/解决方案,因为它提供了一个指针,指向一个对象的接口,该对象与一个包含应用程序必须在旧版本中使用的动态链接库的CLSID相关联。

但是我不知道这个函数“做了什么”,那么我如何“覆盖”这个函数呢?

谢谢。

附言:我是COM编程的新手。

EN

回答 3

Stack Overflow用户

发布于 2011-07-20 22:59:09

与CoCreateInstance()相比,CoGetClassObject()只完成一半的工作。它返回一个类工厂。CoCreateInstance()然后调用IClassFactory::CreateInstance()并释放IClassFactory。只有当您需要创建某个coclass的许多对象并希望对其进行优化时,才会使用它。它避免了一次又一次创建和发布工厂的成本。

您可能忽略了这个问题的一个简单得多的解决方案。只需将新版本的COM服务器DLL复制到与客户端EXE相同的目录中即可。并创建一个名为"app.exe.local“的零字节文件,其中"app”是EXE的名称。这足以强制加载复制DLL,而不是注册表所指向的DLL。MSDN Library关于DLL重定向is here的文章。

票数 6
EN

Stack Overflow用户

发布于 2011-07-20 22:34:47

非常简单的解释是,CoGetClassObject()打开HKCR\CLSID\{ClassId}并查看InProcServer32LocalServer32,这取决于传递的CLSCTX_*值-即COM服务器路径。

一旦找到COM服务器文件路径就加载到COM服务器(进程内使用LOAD_WITH_ALTERED_SEARCH_PATH标志的LoadLibraryEx(),进程外使用CreateProcess() )。然后,它定位并调用进程内服务器的DllGetClassObject(),或者等待,直到为进程外服务器注册了类工厂。

当然,这会忽略DCOM等内容。您可以使用进程监视器工具更好地了解它是如何遍历注册表的。

票数 1
EN

Stack Overflow用户

发布于 2011-07-21 01:25:12

如果您希望加载特定的COM,而不管是否安装了较新的版本,也不管较旧的DLL位于何处,则只需完全忽略CoCreateInstance()CoGetClassObject()。通过LoadLibrary()自己加载旧的动态链接库,然后直接调用其导出的DllGetClassObject()函数来获取动态链接库的IClassFactory接口,然后根据需要调用IClassFactory::CreateInstance()。这是CoCreateInstance()CoGetClassObject()在内部执行的所有操作,但这绕过了它们执行的注册表查找,以确定要加载的DLL路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6763537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档