有关COM的一个简单问题,很容易拿分的.(300分)

  • 主题发起人 主题发起人 highfly
  • 开始时间 开始时间
H

highfly

Unregistered / Unconfirmed
GUEST, unregistred user!
我想写这样一个com组件,这个组件一旦被调用后就初始化一个变量FCount=0,然后客户端程序可以
通过调用setcount的方法来增加这个计数,客户程序不能把FCount清0,可能有多个客户程序,
A,B,C,要使他们都可以调用这个setcount,
比如
在程序A中调用setcount后FCount=1
然后在B中调用setcount后Fcount=2
C再调用后Fcount=3;

下面的程序不行,为什么每次调用后就Fcount=0了?
type
TmyServer = class(TTypedComObject, ImyServer)
private
FCount:integer;
protected
function SetCount: HResult; stdcall;
function GetCount(out count: Integer): HResult; stdcall;
public
procedure Initialize;override;
end;

implementation

uses ComServ;

function TmyServer.SetCount: HResult;
begin
inc(FCount);
end;

function TmyServer.GetCount(out count: Integer): HResult;
begin
Count:=FCount;
end;

procedure TmyServer.Initialize;
begin
inherited;
FCount:=0;
end;

initialization
TTypedComObjectFactory.Create(ComServer, TmyServer, Class_myServer,
ciMultiInstance, tmSingle);
end.
 
简单!!!!!
你将FCount放错地方了
应该在全局区,即:
放在TmyServer 类之外,用Var FCount :integer 进行声明
但应入在implementation之前
 
同意CrazyIdea,不过如果采用下面的方式产生COM对象也可以.
initialization
TTypedComObjectFactory.Create(ComServer, TmyServer, Class_myServer,
[red]ciSingleInstance[/red], tmSingle);
end.
 
每个用户所面对的FCOUNT都是不一样的
所以不行
 
这样还是不行呀.
var FCount:integer;
type
TmyServer = class(TTypedComObject, ImyServer)
private
...

 
to xeen
如果换成你那种创建方式,那就不行了。
应该是多线程。
 
应该是这样:
type
TmyServer = class(TTypedComObject, ImyServer)
end;
var FCount:integer;

implementation

uses ComServ;
 
to CrazyIdea:
不是多线程,是多实例。
改一下这里:
procedure TmyServer.Initialize;
begin
inherited;
end;
 
initialization
TAutoObjectFactory.Create(ComServer, Tff, Class_ff,
ciMultiInstance, tmApartment);
 
谢谢大家.
不过还是不行呀,按照CrazyIdea的方法,在同一个应用程序中计数对了,但关闭这个程序后再打开,
计数又从0开始了.
 
to xeen
 正因为是单实例,所以才不行的。
因为单实例,是说:针对每一个客户都会起动一个实例。
 应该是多实例多线程。
  不信,你试试
 
你的目的是什么,是不是计算有多少个客户端?
 
因为Com是生存期自管理的,关掉所有客户的话,Com本身也关掉了,重起自然从0开始了。
你可以把Com的计数Lock住,就可以。这样,Com在没有客户引用的情况下,不会关闭。
 
to xeen,差不多就是这样的类似客户端处理数据的计数器,但还要计算其他的数据.
 
to CrazyIdea, 怎么Lock呀?
对于其他类型的数据可以Lock吗?
 
implementation

uses ComServ;
var
A : IClassFactory;
initialization
A:= TAutoObjectFactory.Create(ComServer, Ttttt, Class_tttt,
ciMultiInstance, tmApartment);
A.LockServer(true);

end.
 
to CrazyIdea,还是不行呀.
同一个应用程序中没有问题,但再打开另外一个就从0开始了,

比如A已经计数到了10,然后打开B,显示还是0,A中还是10
 
实在不行啊!
那就这样:
  在注册表中开一个键,记录你的个数。那就非常非常easy了。
  别说不会用注册表啊!
 
可是COM如果有多个实例,且FCount有多个值的话,我应该保存哪个值呢?
另外在什么时候保存呢?
 
这样,就不管Com消失不消失。都可以的。
没有办法的办法噢!!!
 
后退
顶部