德尔福的 vb.NET "Interop User Control"相当于什么?



我正在尝试制作一个应用程序,其中包含从第三方应用程序获取的事件/方法/过程。此应用程序需要是active X

我有一个关于VB.NET的工作示例,我需要在Delphi上做一个同样的示例。

vb.net机组启动:

<ComClass(InteropUserControl.ClassId, InteropUserControl.InterfaceId, InteropUserControl.EventsId)> _
Public Class InteropUserControl

这在DELPHI上是完全必要的吗?这只用于在Windows上注册COM类吗?

此外,使用的功能是:

Public Event msgPlugIn(ByRef Msg As String, ByRef MsgResponse As String)

它后来被称为:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim Msg As String
    Dim Response As String = ""
    Msg = "<ID><infoRequest/></ID>"
    RaiseEvent MsgPlugIn(Msg, Response)
    rtb1.Text = Response
    //rtb1 is a regular label
End Sub

这是普通按钮的Onclick吗?

我需要在Delphi中完成这项工作,但我尝试了一切,Automation ObjectCOM Object。。但第三方应用程序什么都没做。

新信息:

我制作了一个活动库,添加了一个COM对象,并创建了一个过程:

    unit DataExchange;
    {$WARN SYMBOL_PLATFORM OFF}
    interface
uses
  Windows, ActiveX, Classes, ComObj, TEST_2_TLB, StdVcl, dialogs;
type
  TDataExchange = class(TTypedComObject, IDataExchange)
  protected
    procedure MENSAJE(out DATA: WideString); stdcall;
  end;
implementation
uses ComServ;
    
procedure TDataExchange.MENSAJE(out DATA: WideString);
begin
  showmessage(DATA);
end;
initialization
  TTypedComObjectFactory.Create(ComServer, TDataExchange, Class_DataExchange,
    ciMultiInstance, tmApartment);
end.

我创建了一个客户端来读取这个dll,调用方式如下:

procedure MENSAJE(out DATA: WideString); external 'TEST__2.ocx';
procedure TForm2.btn1Click(Sender: TObject);
var
texto : WideString;
begin
 texto := edt1.Text;
  MENSAJE (texto);
end;

然后,当我执行客户端时,会出现一个错误:

the Procedure entry point MENSAJE could not be located in the dynamic library TEST__2.ocx

如果我直接在库单元上创建这个过程,它就会工作,就像这样:

library TEST__2;
uses
  ComServ,dialogs,
  TEST_2_TLB in 'TEST_2_TLB.pas',
  MAINFORM in 'MAINFORM.pas' {SuperActiveFORM: TActiveForm} {SuperActiveFORM: CoClass},
  DataExchange in 'DataExchange.pas' {DataExchange: CoClass};

{$E ocx}
procedure MENSAJE(out DATA: WideString); stdcall;
begin
  showmessage(DATA);
end;
exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  DllInstall,
  Mensaje;

{$R *.TLB}
{$R *.RES}
begin
end.

问题是,如果我在单元中创建过程,我会编写它。在COM OBJECT中,我通过ridl文件创建它,并在接口中添加一个方法。

ActiveX库内部的COM对象是向外部应用程序公开功能的正确方法。你的测试客户端失败了,因为你根本没有让它加载COM对象,你试图访问一个独立的函数,但实际上没有。您必须使用regsvr32.exe注册已编译的DLL,然后客户端应用程序可以在需要时使用CoCreateInstance/Ex()实例化COM对象,调用其上的方法,并为其分配事件处理程序。

Delphi(和C++Builder)的一个更好的COM教程是http://www.techvanguards.com依我拙见

最新更新