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

Dll中有Form使用到TImage,但是呼叫Dll時卻無法正確載入圖片jpg。

尚未結案
nady
一般會員


發表:8
回覆:6
積分:2
註冊:2002-11-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-03 14:31:42 IP:211.78.xxx.xxx 未訂閱
前輩們 小弟在寫一個程式(A),會用到我自己寫的Dll(B)。 但是這個Dll會顯示一個Form裡頭有兩張圖,一張是bmp另一張是jpg,分別用TImage載入。 程式(A)本身也有兩張圖,一張是bmp另一張也是jpg,同樣也是用TImage載入。再去呼叫Dll(B)顯示Form和圖片,結果發現程式(A)的兩張圖,會少了一張jpg的。 錯誤是"Unknown picture file extension (.jpg)." 但是Dll(B)的兩張圖都會正確顯示,且程式(A)的bmp也可以正確顯示。那為什麼唯獨程式(A)的jpg不能載入呢?? 我自己有做一些測試 1.如果程式(A)單獨運行(拿掉Dll(B)的Lib和Dll(B)的函式,就是跟Dll(B)完全無關) 結果:程式(A)的兩張圖都很正常的顯示。 2.如果程式(A)和Dll(B)的Lib一起link,但是不呼叫Dll(B)的函式) 結果:程式(A)的jpg那張圖就會無法顯示。 3.如果程式(A)和Dll(B)的Lib一起link,而且也呼叫Dll(B)的函式) 結果:程式(A)的jpg那張圖就會無法顯示。 所以只要程式(A)將Dll(B)的Lib加進專案,TImage 就會無法顯示jpg,但是可以顯示bmp。 我是使用BCB5.0。 請前輩們幫我測試看看吧... 因為我不知道怎麼上傳程式,而且像我這樣的程式碼很短,所以我就沒有上傳程式碼了。還請前輩幫忙。 最後我有試出來可以用的方法,但是很不可思議,而且我也不懂,所以不足採信。 結果:只有將程式(A)和Dll(B)在編譯的時候,都要將"Build with Runtime Package"打勾,才可以讓程式(A)和Dll(B)的4張圖片正常顯示。 可是據我所知的"Build with Runtime Package"並無法解釋這個問題,而且這樣對我的程式以後要散佈到別的電腦還是相當不方便。 還請前輩們指導。 謝謝 sincerely Nady
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-04 00:37:59 IP:211.76.xxx.xxx 未訂閱
nady你好: 嗯…先問個小問題,兩邊的都有include jpeg.hpp的檔頭嗎?
nady
一般會員


發表:8
回覆:6
積分:2
註冊:2002-11-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-04 01:04:02 IP:61.229.xxx.xxx 未訂閱
引言: nady你好: 嗯…先問個小問題,兩邊的都有include jpeg.hpp的檔頭嗎? 哈囉..感謝您的回覆... 是的..我程式(A)和Dll(B)都有加上..應該說是我拉選TImage時,BCB自動幫我加入的。
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 14:35:55 IP:211.76.xxx.xxx 未訂閱
nady你好: 看來真是個不容易的問題,要不要請你先試著在Project Option的Link頁,選link debug library。這樣可以trace進入vcl的source code。應該可以看到問題的根源點。(Build with Runtime Package要取消喔)
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-04 18:07:11 IP:211.76.xxx.xxx 未訂閱
nady 您好:    插個花! 曾經有這樣的經驗: 利用Image將.jpg檔讀入,但一旦動到Image->Picture->Bitmap->Pixels[x][y],該圖形就不見了。 原因是要將Image中的圖形轉成bitmap格式,才能透過Pixels[x][y]存取點的資料。所以會不會是您在dll中有動到Pixel? 如果真如上述所說的那樣,底下程式碼可將Image中的jpg轉成bitmap,提供參考。 <>< class="code"> Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); pBitmap->Width = Image1->Picture->Width; pBitmap->Height= Image1->Picture->Height; pBitmap->Canvas->Draw(0,0,Image1->Picture->Graphic); Image1->Picture->Assign(pBitmap); delete pBitmap; RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/08/04 18:29:02
nady
一般會員


發表:8
回覆:6
積分:2
註冊:2002-11-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-04 22:47:28 IP:61.229.xxx.xxx 未訂閱
哈囉pwipwi,richtop兩位前輩你們好:    非常感謝兩位抽空幫小弟想辦法解決這個怪問題。 目前小弟一共找到兩種解決辦法,但是我都不了解為什麼這樣做可以解決問題。 方法一:就是一定要在編譯Dll和編譯exe時,Build with Runtime Package都要勾選。(就我所知這樣的編譯設定,好像是指編譯的時候BCB並不會將指定的package例如:vcl50.bpl包裝到Dll和exe裡面,所以更是不懂為什麼這樣設定反而才可以正確執行) 方法二:在編譯Dll和編譯exe時,Build with Runtime Package可以不要勾選。但是exe要使用動態連接的方式載入Dll。不可以像方法一一樣使用靜態連接的方式載入Dll。 以上是我測試過的結果。不知道板上的各位前輩是否也有發生像我這樣的問題。 基於求知的慾望,懇請前輩們指點。 謝謝
系統時間:2024-11-25 19:40:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!