2

我正在尝试通过将其作为 COM 类型库导入来访问 Delphi 中的 .NET 程序集 (Position.dll)。一切似乎都可以导入,但生成的 Position_TLB.pas 文件仅包含创建类的函数。没有导入任何类方法或委托。

这就是我所做的。

1) 将 Position.dll 程序集添加到 GAC 中。

gacutil.exe -i Position.dll

2)注册程序集

regasm.exe Position.dll

3) 将程序集作为类型库导入 Delphi

所有导入的类看起来像这样:

  IID__MyClass: TGUID = '{F53EAE3D-9EB8-1111-B1F7-5DB609FDBEAE}';
  CLASS_MyClass: TGUID = '{E15581CD-FFF5-34CE-3434-D5484798900F}';

...

  _MyClass = interface;
  _MyClassDisp = dispinterface;
  MyClass = _MyClass;

// *********************************************************************//
// Interface: _MyClass
// Flags:     (4432) Hidden Dual OleAutomation Dispatchable
// GUID:      {F53EAE3D-9EB8-1111-B1F7-5DB609FDBEAE}
// *********************************************************************//
  _MyClass = interface(IDispatch)
    ['{F53EAE3D-9EB8-1111-B1F7-5DB609FDBEAE}']
  end;

...

// *********************************************************************//
// DispIntf:  _MyClassDisp
// Flags:     (4432) Hidden Dual OleAutomation Dispatchable
// GUID:      {F53EAE3D-9EB8-3538-B1F7-5DB609FDBEAE}
// *********************************************************************//
  _MyClassDisp = dispinterface
    ['{F53EAE3D-9EB8-1111-B1F7-5DB609FDBEAE}']
  end;

...

// *********************************************************************//
// The Class CoMyClass provides a Create and CreateRemote method to
// create instances of the default interface _P2100 exposed by
// the CoClass P2100. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
  CoMyClass = class
    class function Create: _MyClass;
    class function CreateRemote(const MachineName: string): _MyClass;
  end;

...

class function CoMyClass.Create: _MyClass;
begin
  Result := CreateComObject(CLASS_MyClass) as _MyClass;
end;

class function CoMyClass.CreateRemote(const MachineName: string): _MyClass;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_MyClass) as _MyClass;
end;

MyClass 应该包含几个在 TLB 文件中看不到的方法和委托。

如果我在课堂上尝试代码完成,我会看到以下内容:

在此处输入图像描述

我错过了一些明显的东西吗?

4

1 回答 1

3

我也遇到过。不幸的是,您仅限于已添加到嵌入式类型库的内容。

这不是 Delphi 的“故障”,您无法修复它。


除非您想创建自己的托管 DLL,否则它知道如何调用其他托管库的托管方法,并且您自己将它们公开给 COM。

那么正确的任务是使用dll的免注册 COM ,这样您就不必强制用户注册您的COM/托管 dll。

我们已经使用Microsoft Great Pains完成了它。.dll我们在知道如何调用托管 Great Pains 代码的 Visual Studio 中创建自己的代码。然后将所有这些方法公开给 COM。

于 2012-05-08T21:16:32.843 回答