線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1597
推到 Plurk!
推到 Facebook!

使用IPictureDisp时发生catastrophic failure

答題得分者是:wameng
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-01 23:06:21 IP:61.155.xxx.xxx 未訂閱
在同程式使用IPictureDisp可以传递Picture,程式如下: var ipd: IPictureDisp; begin GetOlePicture(Image1.Picture,ipd); SetOlePicture(Image2.Picture,ipd); end; 测试前后结果没有发现尺寸变化等问题。 在COM中使用IPictureDisp传递Picture属性,却发生灾难性故障: server端定义IImageIntf,属性为Image:IPictureDisp Client端Import component后,建立组件TImageIntf 客户端代码为: SetOlePicture(Image1.Picture,ImageIntf1.Image); 执行发生灾难性故障; 调试中在server端未发现错误,但传到client就立刻发生故障 请教大家,这个原因是什么? Justin Shen 發表人 - JustinShen 於 2005/06/01 23:07:36 發表人 - JustinShen 於 2005/06/01 23:09:39
------
====================
我为一切作努力!
Justin Shen

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-01 23:40:21 IP:61.31.xxx.xxx 未訂閱
可參考 http://delphi.ktop.com.tw/topic.php?topic_id=58044 有點混亂。.... 記得幾年前有做過線上Casino,就是用這個。 程式碼不再身邊,我也忘了?先前的討論,將就一點看。 另外,你這樣寫。 看不出來有什麼問題? ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-02 00:06:08 IP:61.155.xxx.xxx 未訂閱
引言: 可參考 http://delphi.ktop.com.tw/topic.php?topic_id=58044 有點混亂。.... 記得幾年前有做過線上Casino,就是用這個。 程式碼不再身邊,我也忘了?先前的討論,將就一點看。 另外,你這樣寫。 看不出來有什麼問題? ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
wameng桑... 那个帖子我已经看过了,可是对于jpeg图片会出jpeg #42错误。 对于IPictureDisp的使用方法,我非常想了解,为什么delphi手册中提到了这个方法却几乎没有人用呢? 我的程式贴图 {Server} ITestIntf = interface(IDispatch) ['{78EF14A4-BCE9-4F4B-9454-6895A751A1B6}'] function Get_Image: IPictureDisp; safecall; procedure Set_Image(const Value: IPictureDisp); safecall; property Image: IPictureDisp read Get_Image write Set_Image; end; function TTestIntf.Get_Image: IPictureDisp; begin GetOlePicture(form1.Image1.Picture,Result); end; procedure TTestIntf.Set_Image(const Value: IPictureDisp); begin SetOlePicture(form1.Image1.Picture,Value); end; {Client} procedure TForm1.Button1Click(Sender: TObject); begin try TestIntf1.Connect; SetOlePicture(Image1.Picture,TestIntf1.Image); finally TestIntf1.Disconnect; end; end; Justin Shen 發表人 - JustinShen 於 2005/06/02 00:29:08
------
====================
我为一切作努力!
Justin Shen

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-02 00:38:21 IP:61.31.xxx.xxx 未訂閱
我已經吃了安眠藥! 神智模糊,發顛中....................^_^||    明日再討論吧。 Sorry ................. ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-02 20:07:20 IP:61.31.xxx.xxx 未訂閱
我試過完全可以。 不過是用 IPicture 給個Mail 我Send 給你。 我是用 Delphi 5 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/06/02 20:08:03
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-02 20:35:11 IP:61.155.xxx.xxx 未訂閱
引言: 我試過完全可以。 不過是用 IPicture 給個Mail 我Send 給你。 我是用 Delphi 5 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/06/02 20:08:03
非常感谢,我的email: LiuyunStudios@hotmail.com 使用IPicture可以的话就不必担心Jpeg格式问题了。 Justin Shen 發表人 - JustinShen 於 2005/06/02 21:13:56
------
====================
我为一切作努力!
Justin Shen

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-02 22:03:10 IP:219.86.xxx.xxx 未訂閱
已寄出。 我是用 Com Object 作法。 臨時寫的。稍微簡陋些。 權做參考。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-02 22:42:06 IP:61.155.xxx.xxx 未訂閱
wameng桑... 程式收到,我看过了IPicture和IPictureDisp是同一个接口的不同名称,都可以直接使用。研究中...    我看问题的关键在于In Process和Out Process的区别吧。还不确定
------
====================
我为一切作努力!
Justin Shen

JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-02 23:08:03 IP:61.155.xxx.xxx 未訂閱
wameng桑... 我在Delphi 6 中测试的结果同样是In Process可以,但Out Process不可以, 用Out Process的方式调试时,可以看到图像显示在客户端的过程,但在之后同样出现“灾难性故障”。 我猜想是因为图像数据还在和服务器端关联,一旦服务器端退出,即接口引用结束图像数据随之被释放。 不知道您同不同意这种解释,请指教。 Justin Shen
------
====================
我为一切作努力!
Justin Shen

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-03 00:52:26 IP:219.86.xxx.xxx 未訂閱
我倒是覺得主要是 In-Process 為共用內存。 因此在調用時,會正常運作。 而Out-Process 為各自獨立的內存地址。 因此導致調用失敗。或者其值為 Nil。 奇怪的事!我檢測結果並未有災難性失敗的錯誤提示。顯示為後者。 因此解決的方法,不外呼使用 IStream 方式。 或OleVariant 方式傳遞圖片內容。 太久沒玩!全忘光光了....... ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-03 08:54:17 IP:61.155.xxx.xxx 未訂閱
感谢wameng桑,终于明白为什么很多人都不用IPicture了。 仍然在思考为什么Microsoft Excel/Visio等等为什么可以用IPicture传输图片,是否是Delphi对OutProcess的内存访问限制。 Justin Shen
------
====================
我为一切作努力!
Justin Shen

pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-12 13:03:51 IP:219.134.xxx.xxx 未訂閱
我感觉,IPicture是传递的指针。Client端拿到后,立即把内容复制到自己的内存里,这样就算Server端释放,也可能没问题了。 也就是说,Client端在调用了Server的Interface function后,先把里面的Data复制到自己的一个VAR里,然后才把Server的Interface释放为nil. 我猜的。你试试。
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-17 08:48:13 IP:221.225.xxx.xxx 未訂閱
引言: 我感觉,IPicture是传递的指针。Client端拿到后,立即把内容复制到自己的内存里,这样就算Server端释放,也可能没问题了。 也就是说,Client端在调用了Server的Interface function后,先把里面的Data复制到自己的一个VAR里,然后才把Server的Interface释放为nil. 我猜的。你试试。
我记得曾经这么做过,不过结果仍然如故。我会继续研究的,如果成功的话我会将具体的实现贴上来。谢谢 Justin Shen
------
====================
我为一切作努力!
Justin Shen

系統時間:2024-06-16 1:37:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!