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就不会出现如上的问题请教了

解决方案 »

  1.   

    可是如果是度卡函数的问题
    那我就要每读一次卡就要重新装载一次Dll
    这样的话,有时候会报
    raise Exception.CreateFmt('%s 文件加载出错', ['GM00001.dll']);
    是不是装载dll会耗费很多资源,造成内存碎片.最后导致无法分配到资源(这里想请高手帮助理解一下).
    那只能找dll提供者修改他的程序了
      

  2.   

    CCID是全局变量?问题应该在GetCCID函数里面。
      

  3.   

    这样声明也可以的
    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;