我使用调用带有CoCreateInstance
的{{1}}的代码来创建对象(脚本编写器)
通过手动加载GUID
,是否可以在不使用GUID
的情况下创建相同的COM对象?如果是,如何找到DLL
,如何知道创建对象的函数的名称?
答案 0 :(得分:0)
没有。
一个COM服务器,无论是DLL还是EXE或其他东西,通常承载许多不同的互连接口的实现。
因此,您将找到服务器的DLL,但您仍然需要告诉服务器它应该为您实现哪些GUID。
请参阅DllGetClassObject入口点http://msdn.microsoft.com/en-us/library/windows/desktop/ms680760.aspx
要查找COM服务器EXE或DLL,请检查{{1}}
等注册表项然后,您的特定库可能会使用其他非COM API复制其主COM API。然后,非COM API将是您可以按照您描述的方式使用的API。如果它为它提供了额外的手段。
然而,就通用COM标准而言,它是不可能的,COM完全围绕GUID构建。
答案 1 :(得分:0)
要直接从DLL创建对象实例,只要您知道它的确切路径,此代码就可以运行:
type
T_DGCO = function(const CLSID, IID: TGUID; var Obj): HResult; stdcall; //DllGetClassObject
var
p: T_DGCO;
f: IClassFactory;
x: IMyObject; //replace by an interface of choice
begin
p := GetProcAddress(LoadLibrary(FullPathToDLL), 'DllGetClassObject');
Win32Check(p <> nil);
OleCheck(p(CLASS_MyObject, IClassFactory, f));
OleCheck(f.CreateInstance(nil, IMyObject, x));
x.Hello('World'); //or whatever your object does
end;