不會delphi,學著用delphi寫了一個讀寫卡操作的ocx,遇到一個問題無法解決。希望能得到各位大神的幫助!謝謝!
問題描述:
瀏覽器取不到ocx方法的回傳值(BSTR*型別的JSON字串);
1.讀寫卡操作呼叫第三方的dll。
2.如果不呼叫dll函式,ocx->瀏覽器正常。
3.呼叫dll函式,呼叫dll正常(回傳值正常),ocx函式正常執行完,瀏覽器取不到ocx回傳值(讀卡會有一個記憶體例外,寫卡回傳值undefined)。
4.修改ocx中dll函式的宣告,將引數型別string改為pchar。呼叫dll函式,回傳例外,ocx->瀏覽器正常。
猜想:是否可能dll的string型別引數引發的問題,或者在dll中拋出該例外之后的代碼引發了未知的問題?
外部函式宣告:
//讀卡
function ic_readcard(port: integer;
s_companycode: string;
var cardtype: integer;
keycode: string;
var userid: pchar;
var meterno: pchar;
var orderlsh: pchar;
var price: real;
var totalmoney: real;
var readflag: integer): integer; stdcall;
external 'SmartCard.dll' name 'ic_readcard';
//寫交易資料到卡中 1購氣 0制卡
function ic_writeorder(port: integer; dllpsw, s_companycode: string;
ordertype: integer;
userid, meterno, orderlsh, keycode: string;
price, totalmoney: real; PriceInMeter: integer):
integer; stdcall;
external 'SmartCard.dll' name 'ic_writeorder';
ocx讀寫卡方法:
//-----------------讀卡
function TAxCardReader.Read: WideString;
var
price, totalmoney: real;
cardtype, readflag: integer;
userid, meterno, orderlsh: pchar;
companycode,keycode:pchar;
msg,temp:WideString;
begin
try
cardtype := 255;
userid := AllocMem(9);
meterno := AllocMem(8);
orderlsh := AllocMem(16);
companycode := '';
keycode :='';
readflag := 1;
price := 0;
totalmoney := 0;
s_msg := '';
try
writeWorkLog('--------------------開始執行讀卡---------------------');
i_result := ic_readcard(10, companycode, cardtype, keycode, userid, meterno, orderlsh, price, totalmoney, readflag);
//i_result := 0;
writeWorkLog('----------------------讀卡結束 結果:'+inttostr(i_result)+'----------------------------');
if i_result=0 then
begin
temp := '111111';
end
else
begin
msg := GetMessage(i_result);
temp := '{state:1,message:"'+msg+'"}';
end;
finally
begin
freeMem(userid);
freeMem(meterno);
freeMem(orderlsh);
end;
end;
except
on e: Exception do
begin
temp := '{state:1,message:"讀卡控制元件內部例外:' + e.Message + '"}';
end;
end;
result := temp;
writeWorkLog('----------------------讀卡函式執行完畢 結果:'+result+'----------------------------');
end;
//---------------------------寫卡
function TAxCardReader.Write(const userid, meterno, orderlsh: WideString;
price, totalmoney: Single): WideString;
var
p_port,p_ordertype,p_PriceInMeter: integer;
p_dllpsw,p_s_companycode,p_keycode: pchar;
p_userid,p_meterno,p_orderlsh: pchar;
p_price, p_totalmoney: real;
msg,temp : WideString;
begin
p_dllpsw := '';
p_s_companycode := '';
p_keycode := '';
p_userid := '';
p_meterno := '';
p_orderlsh := '';
try
p_dllpsw := AllocMem(50);
p_s_companycode := AllocMem(50);
p_keycode := AllocMem(50);
p_userid := AllocMem(50);
p_meterno := AllocMem(50);
p_orderlsh := AllocMem(50);
p_port := 0;
p_ordertype := 1;
p_PriceInMeter := 1;
p_dllpsw := '1AFA821B0BED2151';
p_s_companycode :='';
p_keycode :='';
p_userid := pchar(Utf8ToAnsi(Utf8Encode(userid)));
p_meterno := pchar(Utf8ToAnsi(Utf8Encode(meterno)));
p_orderlsh := pchar(Utf8ToAnsi(Utf8Encode(orderlsh)));
p_price := price;
p_totalmoney := totalmoney;
writeWorkLog('--------------------開始執行寫卡---------------------');
try
i_result := ic_writeorder(p_port, p_dllpsw, p_s_companycode, p_ordertype,
p_userid, p_meterno, p_orderlsh, p_keycode, p_price, p_totalmoney, p_PriceInMeter);
i_result := 1;
writeWorkLog('----------------------寫卡結束 結果:'+inttostr(i_result)+'----------------------------');
if i_result=0 then
begin
temp :='{state:0,message:"寫卡成功"}';
end
else
begin
msg := GetMessage(i_result);
temp := '{state:1,message:"'+msg+'"}';
end;
except
on e: Exception do
begin
temp := '{state:1,message:"讀卡控制元件內部例外:' + e.Message + '"}';
end;
end;
finally
begin
FreeMem(p_dllpsw);
FreeMem(p_s_companycode);
FreeMem(p_keycode);
FreeMem(p_userid);
FreeMem(p_meterno);
FreeMem(p_orderlsh);
end;
end;
result := copy(temp,0,length(temp));
writeWorkLog('----------------------寫卡函式執行完畢 結果:'+temp+'----------------------------');
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55095.html
標籤:VCL組件開發及應用
