灾难性故障!!!!!

coolrain2000 2002-05-31 02:14:34

近日做一小程序,不想得到灾难性故障,实让人不爽,愿高手出手。

-------------------------------------------------------------

这是一个关与com的程序,更确切的说,是关与自动化的。
我做了一个进程外的服务,用automation object.放了一上image在上面。
然后做了一个客户端,同样也放了一个image在Form上面。
目地:通过改变客户端的image,同时改变服务端image。

现在现象:
调试能通过,但运行到关键地方时,出现错误。就是这该死的灾难性故障。
Fpicshow.Set_pic(ipic);
就是这一句!!!
另外:
procedure GetOlePicture(Picture: TPicture; var OlePicture: IPicture);//wrong
procedure SetOlePicture(Picture: TPicture; OlePicture: IPictureDisp);
两处定义不符,调试时按ipicture,类型不匹配。
难道帮助有误?

现在现象:
调试能通过,但运行到关键地方时,出现错误。就是这该死的灾难性故障。
以下附上详细代码:(类型库未列出)
----------------server----------------------
unit Unit1;//服务端界面

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
private
{ Private declarations }
public
function GetPic:TPicture;
procedure SetPic(Avalue:TPicture);
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.GetPic: TPicture;
begin
Result:=Image1.Picture;
end;

procedure TForm1.SetPic(Avalue: TPicture);
begin
Image1.Picture.Assign(Avalue);
end;

end.

##########
unit pictlb;//服务端接口实现

interface

uses
ComObj, ActiveX, picprj_TLB, StdVcl,AXCtrls,graphics;

type
Tpicshow = class(TAutoObject, Ipicshow)
protected
function Get_pic: IPictureDisp; safecall;
procedure Set_pic(const Value: IPictureDisp); safecall;
{ Protected declarations }
end;

implementation

uses ComServ,Unit1;

function Tpicshow.Get_pic: IPictureDisp;
begin
GetOlePicture(Form1.GetPic,Result);
end;

procedure Tpicshow.Set_pic(const Value: IPictureDisp);
begin
SetOlePicture(Form1.GetPic,value);
end;

initialization
TAutoObjectFactory.Create(ComServer, Tpicshow, Class_picshow,
ciMultiInstance, tmApartment);
end.
#################################
unit Unit1;//客户端

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls,picprj_TLB, ExtDlgs;

type
TForm1 = class(TForm)
Image1: TImage;
ConBt: TButton;
DisBt: TButton;
ChangeBt: TButton;
OpenPictureDialog1: TOpenPictureDialog;
procedure ConBtClick(Sender: TObject);
procedure DisBtClick(Sender: TObject);
procedure ChangeBtClick(Sender: TObject);
private
{ Private declarations }
public
FPicshow:Ipicshow;
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses AXCtrls,ActiveX;
{$R *.DFM}

procedure TForm1.ConBtClick(Sender: TObject);
begin
FPicshow:=Copicshow.Create;
end;

procedure TForm1.DisBtClick(Sender: TObject);
begin
FPicshow:=nil;
end;

procedure TForm1.ChangeBtClick(Sender: TObject);
var ipic:IPicturedisp;
begin
if OPenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(openpicturedialog1.FileName);
GetolePicture(Image1.Picture,ipic);
Fpicshow.Set_pic(ipic);
end;

end.
...全文
698 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolrain2000 2002-06-03
  • 打赏
  • 举报
回复
csdn无高手!!!!!!!!!
so disappointed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
coolrain2000 2002-05-31
  • 打赏
  • 举报
回复
to forgot :
总算有人回贴,老兄不错,我会给分给你的。
不过,我想问题还没有搞清。

1.procedure GetOlePicture(Picture: TPicture; var OlePicture:IPicture);
procedure SetOlePicture(Picture: TPicture; OlePicture: IPictureDisp);
你有没有注意到,GetOlePicture中是Ipicture而SetOlePicture中是iPictureDisp。why?应都是IpcitureDisp才对呀!!


另外,可能我没把意思说清,我要做一个server,一个client.
通过改变client而改变server.而不是将server中picture传给client.

ok.我想程序中应该是关与picture的什么地方出了问题,但我实在找不出,哎,真没办法。

另外,我还有一贴,名叫《variant的因惑》,少有人接贴,真伤心,有空也烦老兄帮忙看看,先谢了。

要分,发话就可!!!!



forgot 2002-05-31
  • 打赏
  • 举报
回复
IPicture 实际上是 OlePicture 的指针, 在 Delphi 的 AXCtrlx.pas 中优两个
过程专门进行 ActiveX 中的 OlePicture 和 TPicture 的转换工作:

procedure GetOlePicture(Picture: TPicture; var OlePicture: IPicture);
procedure SetOlePicture(Picture: TPicture; OlePicture: IPictureDisp);

GetOlePicture 将用一个 TPicture 来创建一个 OlePicture
SetOlePicture 将一个 OlePicture 直接转换成 TPicture 对象

欲要将做 Automation Server 中的图像传给其他程序, 可以建立一个 Picture
属性, 供其他程序使用:

interface

type
TMyControlX = class(TActiveXControl, IMyControlX)
private
FDelphiControl
...
public
function Get_Picture: IPictureDisp; safecall;
procedure Set_Picture(const Value: IPictureDisp); safecall;
...
property Picture: IPictureDisp read Get_Picture write Set_Picture;
end;

implementation

function TMyControlX.Get_Picture: IPictureDisp;
begin
GetOlePicture(FDelphiControl.Picture, Result);
end;

procedure TMyControlX.Set_Picture(const Value: IPictureDisp);
begin
SetOlePicture(FDelphiControl.Picture, Value);
end;

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧