解决方案 »
- 距离1970年1月1日0时0分0秒0毫秒的时间转换成TDateTime
- 巨奇怪的问题! adoCmd.CommandText:='UPdate student set stdno=:stdno';
- 简单问题,在窗体里加了个 TVtChart(ActiveX里的)控件,怎么删除
- sql语句?
- 花二千个大洋买了个PIIII主机,可是没用就坏了,装多了程序就死机
- 奇怪!!!!!!!!
- 还是一个小问题
- 请大家进来领分!(关于TMediaPlayer控件和RES文件)
- delphi中new开辟的内存在form关闭后会不会主动释放?
- 如何关闭指定的端口?
- delphi 传输多个文件
- delphi panel移动
1楼纯粹就是瞎扯淡了
你那种方式,我之前也尝试过,但效果一样,另外rtndata.sBack := RandAndEndata; 应该是拷贝,FreeMem(RandAndEndata)之后,对rtndata.sBack 没有影响
此动态库不止TParameterElseUpdate这么一个接口,如果调用约定不对的话,其他同样方式调用的函数应该也出问题,但惟独这个有问题,当然也不能完全排除你说的这种可能。
iRtn := TheFn(sDiv, sEsam,RandAndEndata);
RtnData.iLen := iRtn;
rtndata.sBack := RandAndEndata;
FreeMem(RandAndEndata); 这一块 rtndata.sBack有值吗
有值,而且3步中
reBack := ParamElseUpdate(Pchar(s1), PChar(s2)); //此处调用之后Result变为inaccessible value s := inttostr(reBack.iLen) + ';' + reBack.sBack + ';';
s可得到正确的返回值。
cdecl这种方式试过,也是一样出问题,厂家给的接口没说什么方式调用,原型如下:
函数名称 ParameterElseUpdate(char *RandDivApduData,
char *EsamNum,char *dataout)
函数功能密文+MAC 更新参数
我传上来一个,有兴趣的可以下载下来试试
http://d.download.csdn.net/down/1795836/kampan
SysUtils,
Windows,
StrUtils;type
ReturnChar = record
iLen : integer;
sBack: string;
end;
TParameterElseUpdate = function(sDiv: PChar; sEsam:PChar; RandAndEndata: PChar): Integer; stdcall;function ParamElseUpdate(sDiv:pchar;sEsam:pchar):ReturnChar;
var
idHandle: THandle;
TheFn: TParameterElseUpdate;
RandAndEndata: PChar;
iRtn: Integer;
begin
Result.iLen := -1;
Result.sBack := '';
idHandle := LoadLibrary('TestZhuzhan.dll');
if idHandle = 0 then Exit; try
TheFn := GetProcAddress(idHandle, 'ParameterElseUpdate');
if not Assigned(TheFn) then Exit;
GetMem(RandAndEndata,256);
try
(*FillChar(RandAndEndata^, 255, '.');
RandAndEndata[255] := #0;*)
iRtn := TheFn(sDiv, sEsam, RandAndEndata);
Result.iLen := iRtn;
Result.sBack := RandAndEndata;
finally
FreeMem(RandAndEndata);
end;
finally
FreeLibrary(idHandle);
end;
end;function GetEncrypt(const sIn: string): string;
var
i: integer;
str: string;
s1,s2: string;
s: string;
begin
Result := '';
i := Pos(';',sIn);
if i <= 0 then
exit; str := RightStr(sIn,Length(sIn) - i);
i := Pos(';', str);
s1 := LeftStr(str,i - 1);
str := RightStr(sIn,Length(str) - i);
i := Pos(';',str);
if (i > 0) then
s2 := LeftStr(str,i - 1); with ParamElseUpdate(Pchar(s1), PChar(s2)) do
s := IntToStr(iLen) + ';' + sBack + ';';
Result := s;
end;begin
ChDir('E:\Temp\Test接口\');
Writeln(GetEncrypt('5;BF48F7A0000022000000000004D6890009040001060912050401;1000000000000001;'));
Readln;
end.看过反汇编了,ParameterElseUpdate 的确是3个参数的 stdcall
你的程序我试了一下,的确没报错,但不知为何RandAndEndata始终为空值(在你的Console Application 工程下),另外,我将你的两个函数替换掉我原来程序里的,主程序调用稍微改了下
procedure TfrmMain.Button1Click(Sender: TObject);
var
s: String;
begin
s := GetEncrypt('5;BF48F7A0000022000000000004D6890009040001060912050401;1000000000000001;');
Edit1.Text := s;
end;
运行倒是也没报错,RandAndEndata也得到了值,但单步跟踪 s 一直为空,得不到GetEncrypt的返回值。
如果可以,你抽空试试在非控制台程序下调试,看看结果。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils;
type
ReturnChar = record
iLen : integer;
sBack: string;
end;TParameterElseUpdate = function(sDiv: pchar;sEsam:pchar; RandAndEndata: PChar): Integer; stdcall;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function GetEncrypt(sIn: string): string;
function ParamElseUpdate(sDiv:pchar;sEsam:pchar):ReturnChar;//??????
var
DllHandle: THandle;
TheFn: TParameterElseUpdate;
RandAndEndata: PChar;
RtnData: ReturnChar;
iRtn: Integer;
begin
DLLHandle := LoadLibrary('TestZhuzhan.dll');
try
if dllHandle = 0 then
begin
RtnData.iLen := -1;
RtnData.sBack := '';
end
else
begin
@TheFn := GetProcAddress(dllHandle, 'ParameterElseUpdate');
if @TheFn <> nil then
begin
GetMem(RandAndEndata,256);
iRtn := TheFn(sDiv, sEsam,RandAndEndata);
RtnData.iLen := iRtn;
rtndata.sBack := RandAndEndata;
FreeMem(RandAndEndata);
end
else
begin
RtnData.iLen := -1;
RtnData.sBack := '';
end;
end;
finally
FreeLibrary(DLLHandle);
end;
Result := RtnData;
end;var
i: integer;
str: string;
reBack: ReturnChar;
s1,s2: string;
s: string;
begin
result := '';
i := Pos(';',sIn);
if i <= 0 then
exit; str := RightStr(sIn,Length(sIn) - i);
//??1
i := Pos(';', str);
s1 := LeftStr(str,i - 1);
str := RightStr(sIn,Length(str) - i);
//??2
i := Pos(';',str);
if (i > 0) then
s2 := LeftStr(str,i - 1); reBack := ParamElseUpdate(Pchar(s1), PChar(s2)); //??????Result??inaccessible value s := inttostr(reBack.iLen) + ';' + reBack.sBack + ';';
result := s; //????????
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := GetEncrypt('5;BF48F7A0000022000000000004D6890009040001060912050401;1000000000000001;');
end;end.
你的代码只不过是将我写的那两个函数包在一起而已,我拿过来调试,结果依旧,呵呵,也是D7啊,你那没错?!!
MSN:[email protected] 可以的话做个朋友,呵呵
如果没问题的话,说明是动态调用时,某些资源被提前释放了!
var
i: integer;
str: AnsiString;
reBack: ReturnChar;
s1,s2: AnsiString;
s: AnsiString;
begin
result := '';
i := Pos(';',sIn);
if i <= 0 then
exit; str := RightStr(sIn,Length(sIn) - i);
//参数1
i := Pos(';', str);
s1 := LeftStr(str,i - 1);
str := RightStr(sIn,Length(str) - i);
//参数2
i := Pos(';',str);
if (i > 0) then
s2 := LeftStr(str,i - 1); reBack := ParamElseUpdate(Pansichar(s1), PAnsiChar(s2)); //此处调用之后Result变为inaccessible value result := inttostr(reBack.iLen) + ';' + reBack.sBack + ';' // 就改了这里. end;
我是2009,所以String => AnsiString PChar => PansiChar ; 其它用了你的.
结果是: 200;?4;
目前情况如下:
dinoalex将含有20楼代码的整个工程文件打包发给我,在我这编译运行正常;但,我新建一个工程界面与之一样(界面就一个Edit 一个Button),保存后将dinoalex工程文件中唯一的一个.pas文件Unit1.pas覆盖我新建的文件(将整个Unit1单元代码覆盖也试过),这样再编译运行又出现最开始的问题!
将我建的工程传给dinoalex编译运行也出问题,而他将其中的代码再次复制到他另建的工程则运行正常!
抛开这个不说,我就搞不明白我自己写的代码为什么就过不去!??
华仔看到留言,留个Email 我把工程发给你,在你机器上试试!
ReturnChar = record
iLen : integer;
sBack: string;
end; TParameterElseUpdate = function(sDiv: pchar;sEsam:pchar; RandAndEndata: PChar): Integer; stdcall;....
reBack := ParamElseUpdate(Pchar(s1), PChar(s2)); //此处调用之后Result是ReturnChar 型,而函数返回整型。ReturnChar 类型跟整型没有任何关联。即使不报错堆栈已经混乱不堪
....
result := s; //函数退出是需要清理堆栈,此时自然报错。
就是不知道8字节分散因子怎么弄
调用IdentityAuthentication总返回203(失败)
reBack: ReturnChar;
if @TheFn <> nil then
改为
TheFn := GetProcAddress(idHandle, 'ParameterElseUpdate');
if TheFn <> nil then 我向来都这样调
8字节分散因子怎么弄
调用IdentityAuthentication总返回203
(这个函数第一个参数要传什么)
我也是返回 203 是用插入“测试母卡” 在调用IdentityAuthentication 吧