将.NET程序集类型库导入Delphi不会生成过程

时间:2012-05-03 07:39:49

标签: .net delphi dll assemblies ole

我试图通过将其作为COM类型库导入来访问Delphi中的.NET程序集(Position.dll)。一切似乎都导入OK,但生成的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文件中无处可见的方法和委托。

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

enter image description here

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

1 个答案:

答案 0 :(得分:3)

我也遇到过这种情况。遗憾的是,您仅限于已添加到嵌入式类型库中的内容。

这不是德尔福的“错误”,你无法解决它。


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

然后正确的任务是使用registration-free COM of the dll,这样您就不必强迫用户注册您的 COM /托管dll。

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