function GetHardDisk(): Pchar; stdcall;
var i: integer;
  lhardid: Pchar;
  lstr: string;
begin
  for i := 0 to 3 do
  begin
    lhardid := GetIdeSerialNumber(i);
    if lhardid <> '' then break;
  end;
  if lhardid = '' then Windows.messagebox(0, '无法获取硬盘序列号,请与供应商联系!', '信息提示', 0);
  lstr := lhardid;
  result := pchar(uppercase(trim(lstr)));
end;//这里出错了!
下面一个就不会出错了!
function IdeSerialIsRegsister(Key: string; ideRegsisterserial: string = ''): Boolean; stdcall;
var
  IniFile: TIniFile;
  lfilepath, lserial, lideid: string;
begin
  lfilepath := GetCurrentDir + '\Hard.Ini';
  IniFile := TIniFile.Create(lfilepath);
  lserial := trim(ideRegsisterserial);
  if trim(lserial) = '' then
    lserial := IniFile.ReadString('Regsister', 'Serial', '');
  FreeAndNil(IniFile);
  lideid := GetHardDisk;
  if trim(EncryptIdeSerial(Key, lideid)) <> lserial then
    Result := False
  else
    Result := True;
end;
现在两个都是动态调用!
function GetHardDisk(): Pchar;
type TGetHardDisk = function(): Pchar; stdcall;
var
  GetHardDisk: TGetHardDisk;
  Hm: HMODULE;
begin
  try
    Hm := LoadLibrary(PChar('Hard.dll'));
    if DWord(Hm) > 0 then
    begin
      GetHardDisk := GetProcAddress(Hm, 'GetHardDisk');
      Result := GetHardDisk();
    end;
  finally
    FreeLibrary(Hm);
  end;
end;
调用方式!

解决方案 »

  1.   

    function GetHardDisk(): Pchar;
    type TGetHardDisk = function(): Pchar; stdcall;
    var
      GetHardDisk: TGetHardDisk;
      Hm: HMODULE;
    begin
      try
        Hm := LoadLibrary(PChar('Hard.dll'));
        if Hm = 0 then                          //如果找到链接库
          showmessage('Hard.dll 链接库没找到!')
        else
        begin
          @GetHardDisk := GetProcAddress(Hm, 'GetHardDisk');
          //你在这里没做判断
          if not (@GetHardDisk = nil) then      如果找到该函数
            Result := GetHardDisk();          //则执行该函数并返回结果
          else
            RaiseLastOsError;
        end;
      finally
        FreeLibrary(Hm);
      end;
    end;