Windows 如何通过“使用COM对象”;生的;指针呼叫?

Windows 如何通过“使用COM对象”;生的;指针呼叫?,windows,visual-c++,com,interop,Windows,Visual C++,Com,Interop,我们有一个相当古老的类似COM的组件,它有一组相当复杂的接口。这些接口很难封送,因此我们不在注册表中注册任何东西,而是从组件DLL中导出一个CreateMainObject()函数,该组件DLL检索imainoobject指针,imainoobject接口具有大量其他函数 这样,客户端就不会调用CoCreateInstance()——而是调用LoadLibraryEx()/GetProcAddress(),然后调用CreateMainObject()函数。由于COM实际上没有进入场景,因此无法进

我们有一个相当古老的类似COM的组件,它有一组相当复杂的接口。这些接口很难封送,因此我们不在注册表中注册任何东西,而是从组件DLL中导出一个
CreateMainObject()
函数,该组件DLL检索
imainoobject
指针,
imainoobject
接口具有大量其他函数

这样,客户端就不会调用
CoCreateInstance()
——而是调用
LoadLibraryEx()
/
GetProcAddress()
,然后调用
CreateMainObject()
函数。由于COM实际上没有进入场景,因此无法进行编组-所有操作都是通过直接调用这些对象上的方法来执行的。一切都非常快,但当然不是线程安全的,而且在COM+代理中无法工作

这种COM接口的使用有一个术语吗?

您寻求的术语是“不正确的”,如“这是一种不正确的COM接口使用”


为什么不使用一个方法注册
ICreateMainObject::CreateMainObject
,然后使用此方法使用有效的COM语义实例化对象。

这有点苛刻,不是吗?我不认为COM规范中有任何规定必须使用COM注册表。就我所见,他也没有描述任何暗示违反COM语义的内容。@Chris Dickson:首先,如果客户端使用DLL入口点,为什么不做一个.h/.lib对,并将DLL用作动态库,为什么要增加COM开销?其次,其他客户端应该如何使用该类,如.Net interrop?最后:COM基础设施设置在哪里?在此模型中,谁将CoInitializeX和CoInitializeSecurity称为?该对象是STA还是MTA?是否需要在线程之间封送接口?如何在运行时发现IMainObject的新版本?这种安排对SxS有效吗?@Chris Dickson:更不用说已经存在正确的免费注册COM和激活:我同意有争议的是,他根本没有真正使用COM。。。但我认为他的意思是,他只是使用COM IUnknown AddRef/Release/QI范式通过接口vtables和控制对象生命周期进行动态链接,而不是创建一个更紧密的二进制耦合la.h/.lib。他似乎已经接受了他无法从任何COM服务(如公寓线程安全/远程处理/安全上下文传播)中获益的事实。他只是想为他的模特取个名字&我觉得你的回答有点傲慢。