【问题标题】:Create com object from dll manually手动从 dll 创建 com 对象
【发布时间】:2017-10-30 23:59:02
【问题描述】:

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

【问题讨论】:

  • 是的,如果有平面 API 导出。您正在使用的对象是什么(那个脚本编写者)?
  • jscript.dll, guid : {f414c260-6ac0-11cf-b6d1-00aa00bbbb58}
  • 啊哈,IActiveScript 接口。
  • 为什么需要手动加载DLL?你应该使用CoCreateInstance()。替代方案(Stijn 建议)只是复制 CoCreateInstance() 在内部所做的事情,而无需进行注册表检查。您可以使用Registration-Free COM Activation 来完成此操作,而无需避免使用CoCreateInstance()
  • 您无法重新分发该库。

标签: delphi com


【解决方案1】:

没有。

一个 COM 服务器,无论是 DLL 还是 EXE 或其他什么,通常承载许多不同但相互连接的接口的实现。

因此,您将找到服务器的 DLL,但您仍然需要告诉服务器它应该为您实现的众多 GUID 中的哪一个。

查看 DllGetClassObject 入口点http://msdn.microsoft.com/en-us/library/windows/desktop/ms680760.aspx

要查找 COM 服务器 EXE 或 DLL,请检查注册表项,例如 HKEY_CLASSES_ROOT\CLSID\{00000108-0000-0010-8000-00AA006D2EA4}\InprocServer32

然后,您的特定库可能会使用附加的非 COM API 复制它们的主要 COM API。那么那个非 COM API 将是您可以按照您描述的方式使用的 API。如果它为它提供了额外的手段。

但是就通用 COM 标准而言,这是不可能的,COM 完全围绕 GUID 构建。

【讨论】:

  • 免注册 COM 允许这样做
  • ....仍然会要求创建类。类是 GUID。示例:Microsoft XMLLite.DLL API
【解决方案2】:

要直接从 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;

【讨论】:

  • 如果DllGetClassObject()CreateInstance() 失败,则调用无参数RaiseLastOSError(),因为它们不使用SetLastError() 报告错误,而是返回HRESULT 错误代码。将错误代码保存到一个变量中,并将其传递给重载的RaiseLastOSError(),该RaiseLastOSError() 将错误代码作为输入。或者更好的是,使用OleCheck() 代替(Win32Check() 用于LoadLibrary()/GetProcAddress())。
  • 这个答案没有解决另一个要求,引用:创建相同的 COM 对象不使用 GUID - CLASS_MyObject, IClassFactory 没有声明?
  • 我不知道有什么其他方法可以从 DLL 中获取类工厂实例,而不是使用标识 GUID 请求它...事实上,指定的 DLL 将被使用可能更多比完全避免使用 GUID 更重要。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2012-03-27
  • 2010-09-15
  • 2013-04-10
  • 1970-01-01
  • 2020-08-04
  • 2020-05-03
  • 2012-05-29
相关资源
最近更新 更多