林'尝试使用从第三方应用程序中获取的事件/方法/过程来创建应用程序。
此应用需要是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
这是普通Button的Onclick
吗?
我需要在Delphi中完成这项工作,但是我尝试了所有内容,Automation Object
,COM Object
..但第三方应用并没有做任何事情。
新信息:
我创建了一个活动库并添加了一个COM OBJECT并创建了一个过程:
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 {1}}
如果我直接在库单元上创建此过程,则可以正常工作,如下所示:
could not be located in the dynamic library TEST__2.ocx
问题是,如果我在单元中创建过程,我就会编写它。在COM OBJECT中,我通过ridl文件创建了它,为接口添加了一个方法。
答案 0 :(得分:0)
ActiveX库中的 COM对象是向外部应用公开功能的正确方法。您的测试客户端失败,因为您根本没有加载COM对象,您尝试访问独立函数,但实际上没有。您必须使用 regsvr32.exe 注册已编译的DLL,然后客户端应用程序可以使用CoCreateInstance/Ex()
在需要时实例化COM对象,在其上调用方法,并为其分配事件处理程序
Delphi(和C ++ Builder)的一个更好的COM教程是http://www.techvanguards.com,恕我直言。