全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1181
推到 Plurk!
推到 Facebook!

在98下用Rundll32.exe去啟動dll會產生PageFault

尚未結案
babyfish0226
一般會員


發表:9
回覆:82
積分:23
註冊:2002-06-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-23 01:40:41 IP:221.169.xxx.xxx 未訂閱
程式碼很單純,用程式來調用dll是ok的,但用Rundll32.exe來啟動時在winxp下是正常的,但在win98se下在執行結束後則會跳出PageFault的錯誤,程式碼如下:
library dlltest;    uses
  SysUtils, Dialogs, Windows,
  Classes;    {$R *.res}    procedure test; stdcall;
begin
  ShowMessage('用Rundll32.exe執行dll測試ok!');
end;    exports
  test name test;
end.
在98及xp下執行 rundll32.exe dlltest.dll,test均會正常show出字串的訊息,惟一不同的是在98下的程式結束時會有錯誤,我試著調用別人的dll來測試,結果相同,小弟是使用Delphi7撰寫,會是delphi7的關係嗎?還是要特別處理rundll32的使用? 請各位大哥多多幫忙~~~~
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-23 02:28:49 IP:219.68.xxx.xxx 未訂閱
PageFault... 這應該是WINDOWS的分頁檔配置錯誤.. 分配分頁記憶體的時候..置換空間不足..沒法將程式的記憶體全部置換出來.. 所產生的錯誤..98對於記憶體配置的處理沒有比XP好.. 尼先試看看是否不同電腦的98也是如此.. 或是加大您的分頁記憶體(在系統裡面設) GOOD LUCK..
babyfish0226
一般會員


發表:9
回覆:82
積分:23
註冊:2002-06-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-23 02:40:31 IP:221.169.xxx.xxx 未訂閱
我把錯誤訊息給Po出來好了,基本上就是常見的執行作業無效,別台98...公司都是xp...傷腦筋,至於虛擬記憶體的部份調整過,不過還是一樣~~ < class="code"> RUNDLL32 caused an invalid page fault in module KERNEL32.DLL at 01a7:bff9de3d. Registers: EAX=c00308e0 CS=01a7 EIP=bff9de3d EFLGS=00010202 EBX=0063ff68 SS=01af ESP=0053ff70 EBP=0054020c ECX=00000000 DS=01af ESI=00000000 FS=1177 EDX=bff768d5 ES=01af EDI=bff79138 GS=0000 Bytes at CS:EIP: 53 8b 15 e4 9d fc bf 56 89 4d e4 57 89 4d dc 89 Stack dump:
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-23 03:13:49 IP:219.68.xxx.xxx 未訂閱
library dlltest;
uses
  SysUtils, Dialogs, Windows,
  Classes;    {$R *.res}    procedure test; export;stdcall;far;
begin
  ShowMessage('用Rundll32.exe執行dll測試ok!');
end;    exports
  test name 'test';
end.    
改成紅色的部份..這樣..試看看!! 我是覺得應該是尼的DLL寫的有問題..如果無法有交叉測試的98平台.. 可以在寫一隻程式去CALL這個DLL..GOOD LUCK< > (您是娃娃魚!?< > 好久不見ㄚ ^^) 發表人 - geniustom 於 2004/10/23 03:34:38
babyfish0226
一般會員


發表:9
回覆:82
積分:23
註冊:2002-06-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-23 22:28:58 IP:221.169.xxx.xxx 未訂閱
為了測試我把許久沒用的VMWare再拿起來裝,測試平台為windowsMe,可惜的是只有錯誤訊息稍有不同,您的紅色字部份修正過仍然無效,我換過Delphi6來撰寫,結果也是相同。 我不曉得這問題是屬於我的個案還是一般性問題,dll的部份再三用程式去呼叫均正常,只有當用rundll32.exe去啟動才會出現問題。 這一招一般都是木馬或網咖在用的吧,原本以為很簡單沒想到R#@ZX#$% 寫程式真是不容易啊! 真的好久不見,在k.top我真的算嫩咖,我只敢潛水默默偷學,其實我最常上的網站不是yahoo拍賣就是ktop了,所以我一直都在喔。
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-25 17:31:06 IP:219.68.xxx.xxx 未訂閱
剛剛閒著沒事..所以就灌了一下VM..結果的確如您所說的那樣.. 會出現PAGE FAULT..所以我想問題應該是出在執行了DLL..卻沒有正確的釋放 (如果是一般程式去CALL DLL..會由那支程式來負責釋放) 也許98的RUNDLL32並沒有這個機制..而2000以上會由OS釋放..所以沒這個問題 所以..需要在函式結束時釋放自己本身.. 剛剛突然想到這一點..所以亂TRY了一下..程式修改如下..
library dlltest;
uses
  SysUtils, Dialogs, Windows,
  Classes;    {$R *.res}    procedure test; export;stdcall;far;
begin
  ShowMessage('用Rundll32.exe執行dll測試ok!');
  FreeLibrary(GetModuleHandle(NIL));
end;    exports
  test name 'test';
end.    
後來我用VM來試..果然沒問題了.. 您也試試吧..GOOD LUCK
系統時間:2024-06-26 21:58:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!