200分求购COM最原始最低级原代码!有关这方面的问题,急死了!(200分)

  • 主题发起人 主题发起人 seeyouknowme
  • 开始时间 开始时间
S

seeyouknowme

Unregistered / Unconfirmed
GUEST, unregistred user!

我这里有几本书介绍com的,问题是他们均有一个相同的问题
:一个窗体和automation object ;在type library界面中,
添加接口的方法;刷新后,过程框架自动出现,问题出现了:
实际的代码过程里,书中却是另一个过程,
并且书中也没说该方法,这个问题我这里的几本书均有,急死了!
谁能告之是怎么回事,是书中错了,还是另有其它,或者
介绍一带有原代码的com 例子 (注:不是DCOM)
 
看看李维的《Delphi 5.x 分布式多层应用系统篇》你会大有长进。
 

创建基于DLL的COM

COM(Component Object Model )也就是组件对象模型,这个名
字的更多的来自于硬件接口的含义,但是,这个接口是软件上的。
COM 是一种用于说明如何建立软件组件的规范,由于使用了统一
的接口规范,不同的开发人员创建的COM 组件,可被组合进不同的应
用程序中,而且这些COM 组件所使用的语言,可以是完全不同的。
这对于一个开发软件的集体来说,是有很大的意义的。
DCOM(Distributed Component Object Model)分布式组件对象
模型,这是一种分布式应用程序集成到网络的技术,一个分布式应用
程序由多个进程组成,这些进程协作完成一项工作。
DCOM为COM 组件之间的通信透明的提供可靠、安全和有效的支持
,这些组件包括ActiveX ,脚本和Java小程序。
DCOM可将其应用程序分布到最适合于其顾客和应用程序的位置。
下面通过一个例子,说明COM组件的构造方法。
1〉新建ActiveX库
file -> new -> other -> ActiveX -> ActiveX Libray
OK
产生一个项目文件
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
2〉创建COM对象
File -> new ->Other ->ActiveX ->COM object
OK
类对话框:
输入类名:比如MyShow
出现一个统一的类生成器:
IMyShow ----接口
MyShow ----实现这个接口的对象

在IMyShow 右键 -〉New -> Property
添加一个属性,Name名字起为:Name
再添加一个方法:Method
Name名字起为:HelloName
关于属性,一般的形式是:
protected
function Get_name: WideString;
stdcall;
procedure Set_name(const Value: WideString);
stdcall;
end;

....
function TMyShows.Get_name: WideString;
begin

end;

procedure TMyShows.Set_name(const Value: WideString);
begin

end;

也就是说返回的是function,进入的是procedure。当使用字符串
的时候(WideString),对应的为BSTR。
为了达到这个目的,在建立属性的时候,要注意:
Get:Type->BSTR
Parameters->删除
set: Type->Void
Parameters->Value BSTR [in]
这样就能造成上面的效果。
refresh--->刷新
形成程序的框架,并在框架中写入自己的内容:

具体处理的程序可以这样写:
var Username:string;
function TMyShows.Get_name: WideString;
begin
Result := WideString(Username);
end;

procedure TMyShows.Set_name(const Value: WideString);
begin
Username := String(Value);
end;

关于方法,去掉返回值就是过程,否则是函数:
procedure TMyShows.helloName;
begin
messagebox(0,Username,Username,mb_ok)
end;

这里要注意一个问题,messagebox(0,'','',mb_ok)和showmessage('')
需要Dialogs 库,需要把它Uses进来。
完成的源程序如下:
--------------------------------------------------------------
unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl,Dialogs;
type
TMyShows = class(TTypedComObject, IMyShows)
protected
function Get_name: WideString;
stdcall;
procedure Set_name(const Value: WideString);
stdcall;
procedure helloName;
stdcall;
end;

implementation
uses ComServ;
var Username:string;
function TMyShows.Get_name: WideString;
begin
Result := WideString(Username);
end;

procedure TMyShows.Set_name(const Value: WideString);
begin
Username := String(Value);
end;

procedure TMyShows.helloName;
begin
showmessage('您的名字是:'+ Username);
end;

initialization
TTypedComObjectFactory.Create(ComServer, TMyShows, Class_MyShows,
ciMultiInstance, tmApartment);
end.
----------------------------------------------------------------
File -> Save all 保存
Project -> Build 编译
Run -> Register ActiveX Server 注册

在Delphi中调用COM组件的方法
1)调入COM库:
Project -> Import Type Library
Add -> 该Dll
Create Unit 加入一个关于这个组件单元,这里是Project1_TLB。
file -> Use Unit -> Project1_TLB 把这个库单元加入到当前库中,
注意这里多了一句:uses Project1_TLB;
把Uses补齐,并且定义一个对象变量:
uses Project1_TLB,Comobj,Activex;
var m:MyShows;
在加入form时,要建立一个对象的实例:
procedure TForm1.FormCreate(Sender: TObject);
begin
m:= CoMyShows.Create;
end;

写出两个使用这个对象Button事件:
procedure TForm1.Button2Click(Sender: TObject);
begin
m.Set_name(string(edit1.Text));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
m.helloName;
end;

看看效果。
完成的COM组件是可以在任何语言系统下使用的,你可以在VB下做个实验,
效果应该是完全一样的。




 
感谢xzh200:,我的问题是 基于可执行程序的com
 
你是不是星辰公司的呀。
我给你写一个。
COM的技巧
1、COM服务器程序的建立
delphi-new-application(线程外COM) 然后delphi-new-ACTIVEX- automation object 起名为MYCOMSRV,在IMYCOMSRV中添加一个方法。MYMETHOD。保存并运行(线程外COM运行后自动注册)
delphi-new-ACTIVEX-ACTIVEX LIBRARY(线程内COM) 然后delphi-new-ACTIVEX- automation object 起名为MYCOMSRV,在IMYCOMSRV中添加一个方法。MYMETHOD。保存并运行(线程内COM在DELPHI中的RUN中进行注册)。
2、COM客户端的建立(以线程外COM为例子)
首先在DELPHI的PROJECT-IMPORT TYPE LIBRARY导入EXE文件。
(1)、直接调用USE mycomsrv_tlb
VAR
MYCOMSRV1:TMYCOMSRV;
begin
MYCOMSRV1:=TMYCOMSRV.CREATE(NIL);
MYCOMSRV1.CONNECT;
MYCOMSRV1.MYMETHOD;
end;
(2)、用调度接口USE COMOBJ;
VAR
MYCOMSRV2:IMYCOMSRVDISP;
begin
MYCOMSRV2:=TMYCOMSRV.CREATEOBJ(CLASS_MYCOMSRV) AS IMYCOMSRVDISP;
MYCOMSRV2.MYMETHOD;
end;
(3)、用VARIANT进行调用USE COMOBJ;
VAR
MYCOMSRV3:OLEVARIANT;
begin
MYCOMSRV3:=CREATEOLEOBJECT(‘COMSRV.MYCOMSRV’);
MYCOMSRV3.MYMETHOD;
end;
 
你再看一下上面的,我修改了一下
 
你再看一下上面的,我修改了一下 。
别忘了给分,给分后再给你说一个COM调用的经典用法
 
说吧,说了给分
 
在客户段调用时我刚才用了三种方法调用。
其实这三种方法可以互换。同样可以达到相同的目的。
好了,给分吧。
 
谁还有啊
 
照着《COM原理与应用》(潘爱民著)上的例子做。那才叫最原始最低级,是用Windows API
写的,每个部分都要自己写。
 
呵呵,最原始是用汇编写,自己构造VMT表,
 
有关com,dcom,com+的内容,贴出来同样得分
 
有关com,dcom,com+的内容,得找一下Window NT或2000的书籍看一下才行,
当然,最好懂C++,否则,在Delphi只能很被动的编程。
 
后退
顶部