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

Dll 中的ShareMem 與 XP 搭配的問題

答題得分者是:malanlk
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-19 14:30:06 IP:61.71.xxx.xxx 未訂閱
請問各位!    最近發生很奇怪的事情, 也困擾我很久,  我使用Delphi5+xp pro sp2+p4 3.0 MSI主機板, Dual Mode Ram 512, 當我建立一支dll檔,  Borland 的標準DLL內容, 部份如下
library IOsend;    { Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }    uses
  ShareMem,
  SysUtils,
  Classes,
  DLLver in '..\..\Dll_UT\DLLver.pas',
  U_VarDef in '..\..\Dll_UT\U_VarDef.pas',
  U_Net in '..\..\Dll_UT\U_Net.pas',
  U_IBnet in '..\..\Dll_UT\U_IBnet.pas',
  UT_SYS in '..\..\Dll_UT\UT_SYS.pas' {SysUT},
.....
當我加上ShareMem 時, 某些DLL程式在CLOSE後會出現如下圖的錯誤 , 如果把ShareMem 移掉重新編譯再執行就不會出現, 但並不是每一支dll都會如此, 好像程式越複雜(form多, datamodule多, 程式碼多)就會, 而且很奇怪的是 把這有錯誤的這支移到win98上執行就是ok的, 我測的幾個情況 1.由主程式一進入就呼叫本支程式(有加sharemem), 執行都ok, 一旦formclose就掛點! 2.由主程式進入, 先執行其他dll檔(不會錯誤的), 然後再回頭執行本支->formclose, 竟然也不會當 3.如果本支移除sharemem , 不論由主程式一進入就執行或後執行, 都不會當 4.不論如何修改的dll, 拿到win98都不會當 請問各位有經驗者是否有解決的好方法? 我目前是不加sharemem, 但如果不加, 不知道會不會有什麼後遺症?! 謝謝!
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-19 15:10:15 IP:203.69.xxx.xxx 未訂閱
P.D. 大大的描述是第一次聽到...98很久沒用了, 不知道下面這幾篇是否有幫助...
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-19 16:08:16 IP:61.71.xxx.xxx 未訂閱
引言: P.D. 大大的描述是第一次聽到...98很久沒用了, 不知道下面這幾篇是否有幫助... >< face="Verdana, Arial, Helvetica"> 感謝malanlk提供資訊, 我在上述最後一篇內文找到一段資訊 發表人 - jeffxx 於 2005/08/07 14:58:59 ShareMem d3前使用mapped files 要加 但之後的版本就不用了 這是否意謂Delphi3以後版本使用dll可以不要使用ShareMem了? 因為提供的這幾篇都是不加會出現, 加了就不會, 而我的是加了就會, 不加就不會, 而且重點是之前程式都是有加也不會, 直到今天加了一些code進來就發生了(就算移掉今天加的code, 也一樣發生), 真是令人氣結, 以後不曉得那一天又加了一些code又可以! 謝謝!
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-19 18:01:33 IP:203.69.xxx.xxx 未訂閱
http://delphi.about.com/od/objectpascalide/l/aa103003a.htm http://delphi.about.com/od/objectpascalide/l/aa103003b.htm 這兩篇說明 為何要使用 ShareMem, 由 Delphi7 的 Dll Wizard 來製作 DLL 還是會建議使用 ShareMeme, 所以應該還是要加的. 並推薦 FastShareMem http://qualitycentral.borland.com/wc/qcmain.aspx?d=8639 http://qc.borland.com/wc/qcmain.aspx?d=7834 http://qc.borland.com/wc/qcmain.aspx?d=5133 這兩篇, 在修正 Delphi 6,7 發生的 ShareMem 相關的錯誤, 甚至還有建議 改用 Delphi5 的 Borlndmm.dll 及 建議 Use ShareMem in the application... http://cc.borland.com/Item.aspx?id=21190 Borland 官方網站也推薦 FastShareMem 而且 是 Jan 2005 Updated 只能提供幾個觀點 1. 如果 DLL 只供 delphi 應用程式呼叫, 就連 Application 也加入 ShareMem (.dpr 檔案) 2. 改用 FastShareMem 3. "ShareMem d3前使用mapped files 要加,但之後的版本就不用了" 我看不懂, 可是 DLL Wizard 還是建議使用 ShareMeme, 言下之意就是要加... 4. 我自己本身碰到的, 寫 DLL 時, 參數都是用 pchar, 只有程式裡面有用到 String, 給MFC 呼叫, 會改掉主程式的 Data, 後來加了 FastShareMem 就 OK 了...
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-19 18:48:34 IP:61.71.xxx.xxx 未訂閱
感謝! 我剛才下載了fastsharemem, 然後再次編譯比對, 以sharemem還是當, 但改了fastsharemem 就不會了, 其他的我並沒有改 另外因為我使用的dll 必須傳 vairant 變數, 所以dll中帶的參數是定義為variant, 無法改用pchar, 用fastsharemem已無當機現象, 也就暫不考慮修改, 等那天fastsharemem 又不行時再說吧!
系統時間:2024-04-25 13:03:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!