我正在尝试制作一个应用程序,其中包含从第三方应用程序获取的事件/方法/过程。此应用程序需要是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 Object
、COM 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依我拙见