手动从dll创建com对象

时间:2017-05-30 13:18:51

标签: delphi com

我使用调用带有CoCreateInstance的{​​{1}}的代码来创建对象(脚本编写器) 通过手动加载GUID,是否可以在不使用GUID的情况下创建相同的COM对象?如果是,如何找到DLL,如何知道创建对象的函数的名称?

2 个答案:

答案 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;