代碼如下面所示,在部分win7系統中直接提示制卡失敗,外部組件發生例外,期間添加的全部斷點都不能顯示,斷點加了9個。但是注銷部分的代碼就可以提示注銷成功。
希望高手指點下 不通過重做作業系統或是換電腦解決 可否通過改變程式的代碼解決
謝謝!
unit UProUSB;
interface
uses
Dialogs,
UDllFun,
windows,
SysUtils,
Classes,
DateUtils,
inifiles,
StrUtils;
const
dllname66='proRFL.dll';
ReadCard66='ReadCard';
WriteCard66='GuestCard';
CancelCard66='CardErase';
OpenPort66='initializeUSB';
ClosePort66='ClosePort';
Buzzer66='Buzzer';
ReadRoomNo='GetGuestLockNoByCardDataStr';
ReadTime='GetGuestETimeByCardDataStr';
type
TinitializeUSB66=function(fUSB: Byte):integer;stdcall;
TReadCard66=function(fUSB:Byte;Buffer:PChar):integer;stdcall;
TGuestCard66=function(fUSB:Byte;dlsCoID:Integer;CardNo,dai,llock,pdoors:Byte;BDate,EDate,RoomNo:Pchar;CardHexStr:PChar):integer;stdcall;
TCardErase66=function(fUSB:Byte;dlsCoID:Integer;cardHexStr:PChar):Integer; stdcall;
TClosePort66= function(hCommDev:Integer):integer;stdcall;
TBuzzer66=function(fUSB:Byte;t: Integer):Integer; stdcall;
TGetGuestLockNoByCardDataStr=function(dlsCoID: Integer;cardHexStr,LockNo:PChar):integer;stdcall;
TGetGuestETimeByCardDataStr=function(dlsCoID: Integer;cardHexStr,LockNo:PChar):integer;stdcall;
function opennewcom66(port:pchar):integer;stdcall;
function Readserver66(var st,et:pchar):Tparm;stdcall;
function writeserver66(parm:Tparm):integer;stdcall;
function Cancelserver66():boolean;stdcall;
function closecom66():integer;stdcall;
implementation
uses
UDMdll;
var
handle66:Thandle;
flagUSB:integer;
function opennewcom66(port:pchar):integer;stdcall;
var
refinitializeUSB66:TinitializeUSB66;
ret:integer;
begin
opennewCom66:=0;
handle66:=loadlibrary(dllname66);
flagUSB:=1; //0表示有驅USB, 1表示proUSB
if handle66>32 then
begin
refinitializeUSB66:=GetProcAddress(handle66,OpenPort66);
ret:=refinitializeUSB66(flagUSB);
If ret <> 0 Then
showmessage('USB打開失敗');
end;
end;
function Readserver66(var st,et:pchar):Tparm;stdcall; //讀卡部分
var
refReadCard66:TReadCard66;
refGetGuestLockNoByCardDataStr:TGetGuestLockNoByCardDataStr;
refGetGuestETimeByCardDataStr:TGetGuestETimeByCardDataStr;
ret,coID:integer;
strInfo:array [0..128] of char;
strdata:string;
LockNo,ETime:Array[0..16] of char;
begin
Readserver66.RoomNo:=-1;
Readserver66.CardNo:=-1;
Readserver66.STime:='';
Readserver66.Etime:='';
Readserver66.DATA:='';
Readserver66.BuildNo:=-1;
Readserver66.FloorNo:=-1;
Readserver66.Port:=1;
coID:=strtoint('16711829');
try
coID:=strtoint('75162');
if handle66>32 then
begin
refReadCard66:=GetProcAddress(handle66,ReadCard66);
ret:=refReadCard66(flagUSB,strInfo);
if ret<>0 then
begin
showmessage('讀卡失敗!');
Readserver66.RoomNo:=-1;
strcopy(st,'1900-01-01 00:00');
strcopy(et,'1900-01-01 00:00');
Readserver66.Port:=1;
end
else if leftstr(strInfo,6)<>'551501' then
begin
showmessage('感應區無卡');
strcopy(st,'1900-01-01 00:00');
strcopy(et,'1900-01-01 00:00');
end
else
begin
strdata:=strpas(strInfo);
refGetGuestLockNoByCardDataStr:=GetProcAddress(handle66,ReadRoomNo);
ret:=refGetGuestLockNoByCardDataStr(coID,strInfo,LockNo);
Readserver66.RoomNo:=strtoint(midstr(LockNo,4,3));
strcopy(st,'1900-01-01 00:00');
refGetGuestETimeByCardDataStr:=GetProcAddress(handle66,ReadTime);
ret:=refGetGuestETimeByCardDataStr(coID,strInfo,ETime);
if ret=0 then
strPcopy(et,convertDate(pchar(strpas(ETime))))
else
strcopy(et,'1900-01-01 00:00');
end;
end
else
begin
strcopy(st,'1900-01-01 00:00');
strcopy(et,'1900-01-01 00:00');
end;
finally
end;
end;
function writeserver66(parm:Tparm):integer;stdcall; //寫卡部分
var
refReadCard66:TReadCard66;
refGuestCard66:TGuestCard66;
refBuzzer66:TBuzzer66;
buildno,floorno,roomno:pchar;
i:integer;
coID:Integer;
CardNo:Integer;
LockNo:array [0..8] of char;
stime,eTime:array [0..10] of char;
Dai,Doors,LLock:Byte;
cardHexStr:array [0..128] of char;
ret:integer;
strInfo:array [0..128] of char;
begin
showmessage('1'); //斷點1
writeserver66:=1;
showmessage('2'); //斷點2
buildno:=StrAlloc(3);
floorno:=StrAlloc(3);
roomno:=StrAlloc(4);
coID:=strtoint('67255');
showmessage('3'); //斷點3
CardNo:=0;
Dai:=0;
Doors:=0;
LLock:=1;
try
showmessage('4'); //斷點4
if handle66>32 then
showmessage(inttostr(handle66)); //斷點5
begin
begin
ret:=0;
fillnox(pchar(inttostr(parm.BuildNo)),'0',buildno,2);
fillnox(pchar(inttostr(parm.FloorNo)),'0',floorno,2) ;
fillnox(pchar(rightstr(inttostr(parm.RoomNo),2)),'0',roomno,2);
strPcopy(LockNo,'010'+inttostr(parm.RoomNo)+'99');
strcopy(stime,parm.Stime);
strcopy(eTime,parm.Etime);
showmessage('6'); //斷點6
refGuestCard66:=GetProcAddress(handle66,WriteCard66);
showmessage('7'); //斷點7
ret:=refGuestCard66(flagUSB,coID,CardNo,Dai,LLock,Doors,stime,eTime,LockNo,cardHexStr);
showmessage('8'); //斷點8
showmessage(inttostr(ret)); //斷點9
sleep(1000);
if ret<>0 then
showmessage('寫卡失敗')
else
begin
if flagUSB=1 then
begin
refBuzzer66:=GetProcAddress(handle66,Buzzer66);
refBuzzer66(flagUSB,20);
end;
showmessage('寫卡成功');
end;
end;
end;
finally
strdispose(buildno);
strdispose(floorno);
strdispose(roomno);
end;
end;
function Cancelserver66():boolean;stdcall; //注銷部分
var
refReadCard66:TReadCard66;
refCardErase66:TCardErase66;
ret:integer;
coID:Integer;
cardHexStr:array [0..128] of char;
strInfo:array [0..128] of char;
begin
Cancelserver66:=false;
coID:=strtoint('67255');
try
if handle66>32 then
begin
refReadCard66:=GetProcAddress(handle66,ReadCard66);
ret:=refReadCard66(flagUSB,strInfo);
if ret<>0 then
begin
showmessage('讀卡失敗!');
end
else if leftstr(strInfo,6)<>'551501' then
begin
showmessage('感應區無卡');
end
else
begin
refCardErase66:=GetProcAddress(handle66,CancelCard66);
ret:=refCardErase66(flagUSB,coID,cardHexStr);
if ret=0 then
showmessage('注銷成功')
else
showmessage('注銷失敗');
end;
end;
finally
end;
end;
function closecom66():integer;stdcall;
begin
closeCom66:=0;
end;
end.
uj5u.com熱心網友回復:



補充說明:這是跟著上面的問題附加的圖片說明
其中包含外部組件發生例外的錯誤截圖以及不行的win7系統配置圖和能成功的系統配置圖。
希望高手指點下,如果修改寫卡部分的程式,實作成功操作。非常感謝!
uj5u.com熱心網友回復:
是不是沒把dll放在exe相同目錄下這個是讀磁卡的吧
uj5u.com熱心網友回復:
首先謝謝您的關注。是的,是用于制卡的操作。讀卡部分沒有測驗過,因為寫卡沒有成功就沒辦法讀卡 ,但是注銷是可以實作的 。動態庫dll檔案已經和exe的檔案放在同一個目錄下。同樣的操作同樣的檔案及安裝目錄換到上面的成功的win7系統上就可以,不用改程式的代碼。現在只有靠重做作業系統或換電腦的辦法來解決,希望能通過該程式實作寫卡成功。只要換成xp系統或是上面的那種可以的win7配置就可以提示成功。uj5u.com熱心網友回復:
請高手快快指點下唄~uj5u.com熱心網友回復:
這個錯誤似乎是你呼叫的DLL報出的吧因為從你給出的代碼中未發現彈出你說的資訊部分的代碼
如果是DLL報出的,那么是不是應當從DLL的層面考慮一下問題呢?
uj5u.com熱心網友回復:
感謝您的答復。是這樣的,dll的檔案也有他自己的示例歷程,在他的exe里是不報錯的,我們是根據他提供的這個介面和他做了個對接,上述程式是完全按照他提供的例子的原始碼撰寫的。只要在xp系統里或是某些win7系統下就不會提示外部組件例外,會直接顯示成功。介面的寫卡部分原始碼如下:長川之星客服 14/10/16 15:57:15
procedure TForm1.BitBtn2Click(Sender: TObject);
var
st: Integer;
llock,pdoors: Byte;
sa1: Array[0..128] of char;
begin
if not rdCard then Exit;
llock:=0;
if RadioButton1.Checked then llock:=1;
pdoors:=1;
DateTimePicker1.Time:=DateTimePicker2.Time;
st:=GuestCard(flagUSB,
StrToIntDef(edt_coID.Text,0),
StrToIntDef(edt_CardNo.Text,0),
StrToIntDef(edt_Dai.Text,0),
llock,pdoors,
PCHAR(FormatDateTime('YYMMDDHHMM',Now)),
PCHAR(FormatDateTime('YYMMDDHHMM',DateTimePicker1.DateTime)),
PCHAR(edt_LockNo.Text),
sa1);
if flagUSB=1 then Buzzer(flagUSB,20);
edt_CardData.Text:=StrPas(sa1);
if st<>0 then
Application.MessageBox(Pchar('呼叫發卡函式失敗'+#10+IntToStr(st)),'提示',MB_OK+MB_ICONWARNING)
else begin
Application.MessageBox('呼叫發卡函式成功','提示',MB_OK+MB_ICONINFORMATION);
end;
end;
uj5u.com熱心網友回復:
我現在也是在疑惑,這個錯誤是哪里拋出的,現在認為最大的可能性是作業系統拋出導致的,尤其這套程式在ghost版的win7下運行肯定報錯,是不是因為ghost的系統少一些檔案,現在就是想通過改變代碼來彌補作業系統造成的漏洞。希望各路高手指點下。補充:(注銷部分和讀卡部分就不會報錯,不管是什么作業系統下)。
uj5u.com熱心網友回復:
你分析得應該沒錯,應該改是少了什么東西造成的,動態庫是用什么寫的?C/C++,可以用depends查看下動態庫要用到那些動態庫,如果少了會有提示的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98976.html
標籤:語言基礎/算法/系統設計
上一篇:查詢資料集結果正確,報表結果例外
