C++写的一个度卡dll
里面的一个函数
int GetCCID(char *) //函数参数用于回传值在delphi里面
type
TCharx = array of char;
TGetCCID = function(simiccid : TCharx): Longint; stdcall; //读卡var
GetCCID : TGetCCID;
CCID : TCharx;
用delphi在FormShow里面加载一次dll
try
SetLength(CCID, 200);
if not FileExists(ExtractFilePath(Application.ExeName) + 'GM00001.dll') then
raise Exception.CreateFmt('Can not find file %s', ['GM00001.dll']); CardHandle := LoadLibrary(Pchar('GMP00001.dll')); if CardHandle = 0 then
raise Exception.CreateFmt('%s 文件加载出错', ['GM00001.dll']); GetCCID := GetProcAddress(CardHandle, 'GetCCID');
except
on E : Exception do
MessageBox(PChar(E.Message), '错误提示', mb_ok + mb_iconinformation);
end;然后我调用方法
GetCCID(CCID); //取值到变量CCID里面
===========================================
现在的问题是当我第一次通过函数读卡时,返回到CCID里面的信息是正确的.
但是在我第二次以后读其它卡的时候回传到CCID的数据总是第一次读卡的数据
请教这是为什么啊???(这个是一次性加载dll的问题)然而如果我换一种方法,每读一次卡就重新装载一次dll就不会出现如上的问题请教了
里面的一个函数
int GetCCID(char *) //函数参数用于回传值在delphi里面
type
TCharx = array of char;
TGetCCID = function(simiccid : TCharx): Longint; stdcall; //读卡var
GetCCID : TGetCCID;
CCID : TCharx;
用delphi在FormShow里面加载一次dll
try
SetLength(CCID, 200);
if not FileExists(ExtractFilePath(Application.ExeName) + 'GM00001.dll') then
raise Exception.CreateFmt('Can not find file %s', ['GM00001.dll']); CardHandle := LoadLibrary(Pchar('GMP00001.dll')); if CardHandle = 0 then
raise Exception.CreateFmt('%s 文件加载出错', ['GM00001.dll']); GetCCID := GetProcAddress(CardHandle, 'GetCCID');
except
on E : Exception do
MessageBox(PChar(E.Message), '错误提示', mb_ok + mb_iconinformation);
end;然后我调用方法
GetCCID(CCID); //取值到变量CCID里面
===========================================
现在的问题是当我第一次通过函数读卡时,返回到CCID里面的信息是正确的.
但是在我第二次以后读其它卡的时候回传到CCID的数据总是第一次读卡的数据
请教这是为什么啊???(这个是一次性加载dll的问题)然而如果我换一种方法,每读一次卡就重新装载一次dll就不会出现如上的问题请教了
那我就要每读一次卡就要重新装载一次Dll
这样的话,有时候会报
raise Exception.CreateFmt('%s 文件加载出错', ['GM00001.dll']);
是不是装载dll会耗费很多资源,造成内存碎片.最后导致无法分配到资源(这里想请高手帮助理解一下).
那只能找dll提供者修改他的程序了
TGetCCID = function(simiccid : PChar): Longint; stdcall; //读卡var
S; string;try
SetLength(S, 200);
if not FileExists(ExtractFilePath(Application.ExeName) + 'GM00001.dll') then
raise Exception.CreateFmt('Can not find file %s', ['GM00001.dll']); CardHandle := LoadLibrary(Pchar('GMP00001.dll')); if CardHandle = 0 then
raise Exception.CreateFmt('%s 文件加载出错', ['GM00001.dll']); GetCCID := GetProcAddress(CardHandle, 'GetCCID');
GetCCID(S);
SetLength(StrLen(PChar(S)));
except
on E : Exception do
MessageBox(PChar(E.Message), '错误提示', mb_ok + mb_iconinformation);
end;