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

調用DLL返回值的問題

缺席
stars_chen
一般會員


發表:14
回覆:35
積分:9
註冊:2006-10-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-06 10:20:35 IP:218.104.xxx.xxx 訂閱
我現在是不同的.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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-08 14:52:52 IP:61.64.xxx.xxx 訂閱
請規劃好你存取相同資源的先後次序
例如 DB 是否允許同時的存取
stars_chen
一般會員


發表:14
回覆:35
積分:9
註冊:2006-10-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-09 09:02:13 IP:218.104.xxx.xxx 訂閱
syntax大大,我不明白應該怎麽樣來排序呢?
我覺得在重複調用DLL時會DB中應該是不同的SESSION在工作吧.

===================引 用 syntax 文 章===================
請規劃好你存取相同資源的先後次序
例如 DB 是否允許同時的存取
syntax
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-11 13:54:45 IP:61.64.xxx.xxx 訂閱
DLL 確實是在自己的行程中運作,互不相干
但是,你存取到資料庫,同時是相同的一個

依據使用的資料庫種類,有不同的作法,例如 Lock 資料表
或是在 BDE 內做設定,也許 ODBC 的 Driver 也有提供相關處理方式

這樣的範圍太大,無法給你解答,你要自己去做功課,看你使用哪一種資料庫,翻翻使用說明,看同時存取的相應作法

個人覺得使用資料庫方的解決方式會比較好,不需要一直去測是可以存取,降低網路與時間消耗,增加效能
那個的資料先進資料庫,由資料庫來管理,程式只要負責丟資料就好

===================引 用 stars_chen 文 章===================
syntax大大,我不明白應該怎麽樣來排序呢?
我覺得在重複調用DLL時會DB中應該是不同的SESSION在工作吧.

===================引 用 syntax 文 章===================
請規劃好你存取相同資源的先後次序
例如 DB 是否允許同時的存取
系統時間:2024-05-04 12:10:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!