我正在尝试使用事件/方法/程序制作的应用程序,该应用程序应从第三方应用程序中获取。这个应用程式必须是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
信息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对象中,我通过ridl文件将其添加到接口中,并添加了一个方法。
一个COM对象的内部的ActiveX库是揭露功能之外的应用程序正确的做法。您的测试客户端失败了,因为您根本没有加载COM对象,您尝试访问独立功能,但实际上没有任何功能。您必须使用regsvr32.exe注册已编译的DLL ,然后客户端应用程序可以用来CoCreateInstance/Ex()
在需要时实例化COM对象,调用该对象上的方法并为其分配事件处理程序。
http://www.techvanguards.com,恕我直言,这是Delphi(和C ++ Builder)更好的COM教程之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句