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

原本正常執行檔 一執行會無預警的出現程式出現例外錯誤....

答題得分者是:syntax
firesu
中階會員


發表:26
回覆:28
積分:55
註冊:2004-12-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-06 09:10:12 IP:61.62.xxx.xxx 未訂閱
如題,
原本都是可以正常執行的exe檔,
會無緣無故在某一次要執行時,出現例外錯誤,然後此exe檔就沒辦法再執行了..
目前有發生的都是在xp sp2上,
不過把這隻出現問題的執行檔co到別台電腦卻又都可以正常執行...

程式用 delphi 7 在win2000上編譯的,
也不確定是原本程式就是有問題..要是有問題應該每次執行就會出現.

程式一開始也沒寫什麼特別的程式碼, 就連上網看有沒有新版本,要不要更新而已..
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-02-06 09:54:02 IP:61.219.xxx.xxx 未訂閱
如果程式在 Delphi 7 on WinXP 上 Compile 呢 ?
XP 防火牆是否開啟 ? 關閉執行看看
乾淨不安裝任何軟體的 XP SP2 上也是異常嗎 ?
程式碼可以壓縮上傳來看看嗎 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
firesu
中階會員


發表:26
回覆:28
積分:55
註冊:2004-12-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-02-06 14:05:16 IP:61.62.xxx.xxx 未訂閱
早上又出現一次了,
這次是遠端連到客戶的電腦作維護的時候..
第1次run程式..都沒問題, 結果關閉程式然後要再run時,問題又出現了 然後這隻程式就都不能再run了...
當中都沒去動過windows任何設定..只是程式關掉 然後再執行一次..

用D7在xp上編譯這個 我在試試看
網路檢查版本的程式碼是後來才 上的..之前沒 這段程式碼的exe都沒出現問題...

程式片斷..晚點弄上來(排的很亂..)
<textarea class="delphi" rows="10" cols="60" name="code">function CenterStr(Src:String;Before,After:String) :String; var Pos1,Pos2 :WORD; begin Pos1:=Pos(Before,Src) Length(Before); Pos2:=Pos(After,Src); Result:=Copy(Src,Pos1,Pos2-Pos1); end; function GetOnlineStatus: Boolean; var ConTypes : Integer; begin ConTypes := INTERNET_CONNECTION_MODEM INTERNET_CONNECTION_LAN INTERNET_CONNECTION_PROXY; if (InternetGetConnectedState(@ConTypes, 0) =False) then Result := False else Result := True; end; function GetVersion : string; var VerInfoSize : DWORD; VerInfo : Pointer; VerValueSize : DWORD; VerValue : PVSFixedFileInfo; Dummy : DWORD; begin VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); with VerValue^ do begin Result := IntToStr(dwFileVersionMS shr 16); Result := Result '.' IntToStr(dwFileVersionMS and $FFFF); Result := Result '.' IntToStr(dwFileVersionLS shr 16); Result := Result '.' IntToStr(dwFileVersionLS and $FFFF); end; FreeMem(VerInfo, VerInfoSize); end; procedure CheckNewVer; var NVer,APVer :String; B:Boolean; IdHTTP1: TIdHTTP; begin B:= GetOnlineStatus; if B then begin //網路可以連線 NewVer:=False; NewVerLink:=''; try IdHTTP1:=TIdHTTP.Create(application); APVer:=GetVersion; RunNewVerError:= False; try Idhttp1.HandleRedirects := True; IdHttp1.head(ChkFile); NVer:=CenterStr(idhttp1.Get(ChkFile),'[ver]','[/ver]'); if ApVer<>NVer then begin NewVer:=True; //全域變數 NewVerLink:=CenterStr(idhttp1.Get(ChkFile),'[link]','[/link]'); //全域變數 新版的下載位置 end else begin NewVer:=False; NewVerLink:=''; end; except on eidhttpprotocolexception do begin RunNewVerError:=True; if idhttp1.ResponseCode = 404 then MessageDlg(MS_SCOKETERROR,mtError,[mbYes],0); end; on eidreadtimeout do begin RunNewVerError:=True; if idhttp1.ResponseCode = 404 then MessageDlg(MS_SCOKETERROR,mtError,[mbYes],0); end; on EIdSocketError do begin RunNewVerError:=True; MessageDlg(MS_SCOKETERROR,mtError,[mbYes],0); end; end; finally FreeAndNil(IdHTTP1); end; end else begin //網路不能連線 NewVer:=False; NewVerLink:=''; end; end; </textarea>
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-02-14 16:45:17 IP:61.64.xxx.xxx 訂閱
根據你的問題陳述,可以想見是程式設計不良所造成

何以見得?
原因在於
1, 第一次一定可以執行
2.當掉後,再也無法執行,但在他台電腦,如是第一次執行,也一定可以執行
因為他台電腦不定,包含客戶的電腦

歸納出,問題與電腦無關,主要是你的程式出錯,但為何跟一般程式當掉後的反應有所不同
主要就在於,這是一支「網路」程式 (也許是用了 con ?)

所以簡單的原因在於,你在程式當掉時,並沒有做好錯誤管理,以致於當掉後的資源無法釋放
一般是無所謂,但問題就在於 socket 的資源是固定的,被當掉的程式佔住,如果不是放,除非你使用另一個 socket resource
不然,只好等該資源被釋放,至於何時釋放,就要看運氣囉,因為不容易解釋間單幾個字就解釋清楚,那就歸給運氣吧

建議你先鎖定應該或可能造成當機程式碼區域,然後除錯,應該可以發現問題

function CenterStr(Src:String;Before,After:String) :String; 這程式不安全


測試連線建議使用
try
HTTP_Connector_IdHTTP.Connect(xxxx);
except
on eidhttpprotocolexception do begin end; 什麼都不做
HTTP_Connector_IdHTTP.Connected 就是 連上或沒連上

很可能是 NewVerLink 取得的位置有問題,導致你沒貼出的部分的程式當掉了
firesu
中階會員


發表:26
回覆:28
積分:55
註冊:2004-12-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-02-14 17:05:08 IP:61.62.xxx.xxx 未訂閱
找到錯誤點了,前面的程式段之後,
做更新版本的同時,會執行一段procedure把客戶在軟體內設定的公司名稱,電話
等基本資料post到server上

procedure sendbasic;
const
theUrl = 'http://xxxxxxxxxxxxxxx/xxxxxxx/xxxxx.py';
var
data: TIdMultiPartFormDataStream;
YN:string;
IdHTTP1: TIdHTTP;
begin
YN := 'N';
data := TIdMultiPartFormDataStream.Create;
try
IdHTTP1:=TIdHTTP.Create(application);

data.AddFormField('CompNMC', CORPNMC);
data.AddFormField('CompADRS', CORPADRS);
data.AddFormField('CompTEL', CORPTEL);
data.AddFormField('CompFAX', CORPFAX);

data.AddFormField('END', 'END');
YN := IdHTTP1.Post(theUrl, data);
finally
freeandnil(IdHttp1);
end;
data.Free;
end;

是server設公司的ip才能連.....之後開放就ok了
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-02-16 20:53:53 IP:61.64.xxx.xxx 訂閱
呵呵

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