在client中如何调用COM服务器中的绘制服务在Client的界面元素中进行绘制?(100分)

  • 主题发起人 主题发起人 GISxChen
  • 开始时间 开始时间
G

GISxChen

Unregistered / Unconfirmed
GUEST, unregistred user!
我想设计一个COM服务器,它提供了一种绘制服务,如Drawline可以在某一种
Canvas上画线串。现在,在Client中想调用服务器中的这个功能在Client的界面元素(如Form、Panel等)上实现该绘制,不知道如何给COM服务器传递参数,请高手解答?多谢!!!
 
传送Window Handle就可以,但COM服务器必须在本地。
 
首先对Langer给出的answer表示感谢!
我的COM服务器(Exe,本地服务器)中的绘制函数是这样写的
Drawtext(Hdc:Thandle;Content:String)
begin
...
textout(hdc,10,10,content,20);
...
end;
在包含COM服务器的主窗口中,创建服务器对象,然后把主窗口的handle传递出去,是可以在主窗口中显示文本内容(我想是因为在同一进程中)
......
private
Imyinterface:IMyTextCom;//IMyTextCom是我的COM提供的接口,包含Drawtext服务。
.....
procedure TForm1.FormCreate(Sender: TObject);
begin
Imyinterface:=coMyTextCom.create;
end;
....
procedure TForm1.Button1Click(Sender: TObject);
var
hd:Thandle;
begin
hd:=form1.canvas.handle;
Imyinterface.drawText(hd,'hello');
end;

但是在我编写了客户程序中,我把客户程序中的界面元素Handle送给服务器,却无法实现文本绘制,我想是否是因为在不同的进程中,Window handle不一致的原因呢?该如何传递参数呢?请指教。客户端调用的代码如下:
procedure TForm1.BtnDrawTextClick(Sender: TObject);
var
hwd:THandle;
begin
hwd:=form1.Canvas.Handle;
IClientInf.Drawtext(hwd,'Hello');//IClientInf是在客户窗体Create时创建的COM服务器的接口;
end;
这种方法在客户端界面(Form)中不能显示文本。
 
可疑处:Drawtext(Hdc:Thandle;Content:String)
上述好像不正确,如果EXE服务器能够正确编译的话,那么Drawtext方法一定
没有在接口中声明,因为Thandle及String不是COM类型兼容的(笔误?)。
另外:Handle对本地系统是全局的,由操作系统负责维护。从代码中看不出其他
问题,方便的话请将代码发到:langger@sina.com
 
源代码已送向langger@sina.com,我的mailbox: njgixchenxin@sino.com
 
sorry : njgischenxin@sino.com
 
GISxChen:程序已经收到,对不起这两天加班,在公司看又不方便,明天一定给你一
个答复。
 
建议:
我认为用回调或可连接对象解决比较好:比如在客户端实现函数:
Drawtext(Content:String),然后在COM服务器回调
Drawtext(Content:String)传送要回执的内容,具体的绘制工作由客户端完成,
这样适应性更好,COM服务器甚至可以在远程计算机上。
 
To GISxChen:
由于你发来的文件缺少类型库,因此没有办法测试你的程序。马上就要发给你的
例子是我根据你的例子而重新编写的,在客户端可以完成工作,请查收。
另外,如果EXE服务器是在客户端运行,为什么不定义为DLL服务器?这样效率较高又
可以节约资源。
 
多谢大侠们的指教,尤其是Langer。
 
后退
顶部