調用DLL返回值的問題 |
缺席
|
stars_chen
一般會員 發表:14 回覆:35 積分:9 註冊:2006-10-29 發送簡訊給我 |
我現在是不同的.EXE文件調用同一個DLL文件時,當不同的.EXE文件同一時間傳入參數給DLL文件時,DLL文件會出現不能返回結果,根據在DLL文件中做的LOG來看(LOG只記錄到執行到下面紅色部分)是調用的DLL文件中沒有執行完成.如:(E:\A.EXE 和 F:\B.EXE兩執行文件同一時間調用D:\REELINFO.DLL文件)(例:調用DLL文件執行完並返回結果需要200毫秒,當A.EXE在1毫秒時傳入參數調用DLL文件,這時B.EXE在5毫秒後也傳入參數調用DLL文件時,就會出現這種狀況了)
請問有大大們知道這是什麽原因嗎?還是因為進程的原因呢?急需解決...... 有什麽方法能解決呢? 下面中我的DLL文件中的FUNCTION function GetReelIDInfo(iReelID, oItem, oTQty, oMsg: Pchar): Integer; var vF: TiniFile; vDB: string; vSERVER: string; vInterval: integer; begin try try Result := 0; DataModule1 := TDataModule1.Create(nil); DataModule1.WirteLog('GetReelIDInfo Function Start...'); vF := TiniFile.Create(ExtractFilePath(Application.ExeName) 'SFISPRI.INI'); vDB := vF.ReadString('SFISDB', 'DB', ''); vSERVER := vF.ReadString('SFISDB', 'SERVER', ''); try DataModule1.OraSession1.ConnectString := 'PPPPPP@' vSERVER ':1521:' vDB; DataModule1.OraSession1.Connected := True; DataModule1.WirteLog('DB Connect ' vDB ' ok'); except on E: Exception do begin Result := -4; StrPCopy(oItem, ''); StrPCopy(oTQty, '0'); StrPCopy(oMsg, 'DB Connect Exception: ' E.Message); DataModule1.WirteLog('-4 : DB Connect Exception: ' E.Message); Exit; end; end; try with DataModule1.OraQuery1 do begin Close; sql.Clear; sql.Add('SELECT A.ITEM, A.TQTY FROM REELIDINFO A, ITEM B WHERE B.ITEM( )=A.ITEM AND A.REELID=' Quotedstr(iReelID)); Open; DataModule1.WirteLog('Query REELID:' iReelID); if isEmpty then begin Result := -1; StrPCopy(oMsg, 'REELID[' iReelID '] NOT FOUND!'); DataModule1.WirteLog('-1 : REELID[' iReelID '] NOT FOUND!'); Exit; end; StrPCopy(oItem, FieldByName('ITEM').AsString); StrPCopy(oTQty, FieldByName('TQTY').AsString); if (FieldByName('ITEM').AsString = '') and (FieldByName('TQTY').AsString <> '') then begin Result := -2; oMsg := StrPCopy(oMsg, 'GET OK: REEL[' iReelID '],TQTY[' oTQty '],ITEM IS ISEMPTY!'); DataModule1.WirteLog('-2 : GET OK: REEL[' iReelID '],TQTY[' oTQty '],ITEM IS ISEMPTY!'); exit; end; if (FieldByName('ITEM').AsString <> '') and (FieldByName('TQTY').AsString = '') then begin Result := -3; oMsg := StrPCopy(oMsg, 'GET OK: REEL[' iReelID '],ITEM[' oItem '],TQTY IS ISEMPTY!'); DataModule1.WirteLog('-3 : GET OK: REEL[' iReelID '],ITEM[' oItem '],TQTY IS ISEMPTY!'); exit; end; Close; oMsg := StrPCopy(oMsg, 'GET OK: REEL[' iReelID '],ITEM[' oItem '],TQTY[' oTQty ']!'); DataModule1.WirteLog('0 : GET OK: REEL[' iReelID '],ITEM[' oItem '],TQTY[' oTQty ']!'); end; except on E: Exception do begin Result := -5; StrPCopy(oItem, ''); StrPCopy(oTQty, '0'); StrPCopy(oMsg, 'Query ReelID Info Exception : ' E.Message); DataModule1.WirteLog('-5 : Query ReelID Info Exception : ' E.Message); Exit; end; end; except on E: Exception do begin Result := -6; StrPCopy(oItem, ''); StrPCopy(oTQty, '0'); StrPCopy(oMsg, 'Exception : ' E.Message); DataModule1.WirteLog('-6 : Exception : ' E.Message); Exit; end; end; finally DataModule1.WirteLog('GetReelIDInfo Function Over...'); DataModule1.Free; end; end; |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
|
stars_chen
一般會員 發表:14 回覆:35 積分:9 註冊:2006-10-29 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
DLL 確實是在自己的行程中運作,互不相干
但是,你存取到資料庫,同時是相同的一個 依據使用的資料庫種類,有不同的作法,例如 Lock 資料表 或是在 BDE 內做設定,也許 ODBC 的 Driver 也有提供相關處理方式 這樣的範圍太大,無法給你解答,你要自己去做功課,看你使用哪一種資料庫,翻翻使用說明,看同時存取的相應作法 個人覺得使用資料庫方的解決方式會比較好,不需要一直去測是可以存取,降低網路與時間消耗,增加效能 那個的資料先進資料庫,由資料庫來管理,程式只要負責丟資料就好 ===================引 用 stars_chen 文 章=================== syntax大大,我不明白應該怎麽樣來排序呢? 我覺得在重複調用DLL時會DB中應該是不同的SESSION在工作吧. ===================引 用 syntax 文 章=================== 請規劃好你存取相同資源的先後次序 例如 DB 是否允許同時的存取 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |