谁来教教我怎么作COM ?(300分)

  • 主题发起人 主题发起人 www
  • 开始时间 开始时间
W

www

Unregistered / Unconfirmed
GUEST, unregistred user!
谁来教教我怎么作COM ?

大家好,本人开始刚学COM , 想作一个Out-Process型的COM服务器(exe文件),但不知
如何下手,DLL类型的COM好多书上都有讲的,我已经差不多会了,现在向了解一下进程外
COM(.exe)的做法,请大家帮我. 300大洋送上.
 
这不是一下子能说清楚得,建议看看书,或者找点其他的资料。
 
来个小例子就行了.
 
分全给我,我一步一步教你
 
to yue_shan,
分不是问题,你来教教我呀.
 
谁给我一个小例子,这300分就全是他的了.
 
1. File---->New---->ActiveX------>ActiveXLibrary---->OK------>Save:ComSrv.dpr
library ComSrv;

uses
ComServ,
ComCls in 'ComCls.pas',
Calc in 'Calc.pas',
ComSrv_TLB in 'ComSrv_TLB.pas';

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;

{$R *.TLB}

{$R *.RES}

begin
end.
2. File---->New---->ActiveX------>ComObject----->OK----Save:Calc.pas
unit Calc;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
Windows, ActiveX, Classes, ComObj, ComCls;

type
TCalc = class(TComObject,ITest)
protected
public
function CalcHe(one,two: integer): integer;
end;

const
Class_Calc: TGUID = '{471E8DCB-C4F8-49F8-A5C8-036E9B605430}';

implementation

uses ComServ;

{ TCalc }

function TCalc.CalcHe(one, two: integer): integer;
begin
Result := one + two;
end;

initialization
TComObjectFactory.Create(ComServer, TCalc, Class_Calc,
'Calc', '', ciMultiInstance, tmApartment);
end.
3. File---->New---->Unit---->OK----->Save:Calc.pas
unit Calc;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
Windows, ActiveX, Classes, ComObj, ComCls;

type
TCalc = class(TComObject,ITest)
protected
public
function CalcHe(one,two: integer): integer;
end;

const
Class_Calc: TGUID = '{471E8DCB-C4F8-49F8-A5C8-036E9B605430}';

implementation

uses ComServ;

{ TCalc }

function TCalc.CalcHe(one, two: integer): integer;
begin
Result := one + two;
end;

initialization
TComObjectFactory.Create(ComServer, TCalc, Class_Calc,
'Calc', '', ciMultiInstance, tmApartment);
end.
4.注册:Run----->Register ActiveX Server
服务器至此OK了,下面建立客户端:见文件:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCls, ComObj;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
Test: ITest;
i: integer;
begin
Test := CreateComObject(Class_Calc) as ITest;
i := Test.CalcHe(10,15);
showmessage(inttostr(i));

end;

end.


 
to yue_shan,
谢谢你,可是我要的是Out-Process型的COM, 是一个exe文件,即可单独执行,同时又是一个COM服务器的.
 
delphi/demos/activex/oleauto/autoserv下有一个out_process型comserver的例子
自己看吧!
 
那我再来:
1、重新开始一个项目
2、New-->ActvieX-->AutomationObject-->OK-->(输入:AutoTest)-->OK-->Save All:
Unit2.pas 存为; untMailIMPL
Unit1.pas 不变
Project1.dpr存为AutoTestSrv.dpr
3、在Type Library Editor中选择IAutoTest点击工具条上的New method,Method1命名为:AddTwo,在右边的Parameters中加三个参数如下:
Name Type Modifier
One long [in]
Two long [in]
Value long* [out,retval]
点击点击工具条上的Refresh
4、编辑untMail.pas中的function TAutoTest.AddTwo(One, Two: Integer): Integer;
Result := One + Two;
5、Run
6、重新一个项目
7、Projects--->Import Type Library---->选择: AutoTestSrv Library[version 1.0]-->Install-->OK-->Yes-->OK--Save All
8、将ActiveX中AutoTest放入form中可也
 
多谢yue_shan, 多谢各位,
不过yue_shan,你还是理解错了,我要的是exe型的COM,你作的仍然是dll型的,我现在已经会作了.
EXE型的COM服务器,作为一个程序,既可以象普通的GUI Application一样独立运行,
又提供了Automation接口,可以作为一个Automation Server。
 
还是wfzha提醒了我,多谢
 
多人接受答案了。
 
后退
顶部