delphi高手進,這個DLL在VFP和DELPHI中調用都報錯,有什麼問題?
DELPHI中是不能用FREELIBRARY RELEASE.
VFP調用代碼
DECLARE string BIG5toGB IN "f:\project1.dll" string
=messagebox(BIG5toGB('瓣悔'))DELPHI調用代碼
procedure TForm1.Button1Click(Sender: TObject);
var
  DllHandle: THandle;
  BIG5toGB: TBIG5toGB;
begin
  DllHandle := Loadlibrary('f:\project1.dll');
  try
    if DllHandle = 0 then exit;
    @BIG5toGB := GetProcAddress(DllHandle, 'BIG5toGB');
    if Assigned(@BIG5toGB) then showmessage(BIG5toGB('瓣悔Τ肂そ'));
  finally
    showmessage('test');    if DllHandle <> 0 then
    FreeLibrary(DllHandle);
  end;
end;庫代碼library Project1;uses
  ShareMem,
  SysUtils,
  Classes;  var
  BIG5Order: array[0..14757] of Word;
  GBOrder  : array[0..8177] of Word;function GBOffset(value: string): integer;stdcall;
begin
  if length(value) >= 2 then
    Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
  else
    Result := -1;
end;function BIG5Offset(value: string): integer;stdcall;
begin
  Result := -1;
  if length(value) >= 2 then
  begin
    if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
      Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
    if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
      Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
  end
end;function WordToString(value: Word): string;stdcall;
begin
  Result := Chr(Hi(value)) + Chr(Lo(Value));
end;function isBIG5(value: string): Boolean;stdcall;
begin
  if (length(value)>=2) then
  begin
   if (value[1] < #161) then
     Result := false
   else
     if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
       Result := true
     else
       Result := false
  end
  else
    Result := false
end;function isGB(value: string): Boolean;stdcall;
begin
  if (length(value)>=2) then
  begin
    if (value[1] <= #161) and (value[1] >= #247) then
      Result := false
    else
      if (value[2] <= #161) and (value[2] >= #254) then
        Result := false
      else
        Result := true
  end
  else
    Result := true;
end;function GBtoBIG5(value: string): string;stdcall;
var
  leng, idx      : integer;
  tmpStr         : string[2];
  Offset         : integer;
  output         : string;
begin
  output := '';
  leng := length(value);
  idx := 1;
  while idx <= leng do
  begin
    tmpStr := value[idx]+ value[idx + 1];
    if isGB(tmpStr) then
    begin
      offset:=GBOffset(tmpStr);
      if (offset >= 0) and (offset <= 8177) then
      begin
        output := output + WordToString(GBOrder[offset]);
        inc(idx);
      end
      else
        output := output + value[idx] ;
    end
    else
      output := output + value[idx] ;    inc(idx, 1);
  end;
  Result := output;
end;function BIG5toGB(value: string): string;stdcall;
var
  leng, idx      : integer;
  tmpStr         : string[2];
  output         : string;
  offset         : integer;
begin
  output := '';
  leng := length(value);
  idx := 1;
  while idx <= leng do
  begin
    tmpStr := value[idx]+ value[idx + 1];
    if isBIG5(tmpStr) then
    begin
      offset:=BIG5Offset(tmpStr);
      if (offset >= 0) and (offset <= 14757) then
      begin
        output := output + WordToString(BIG5Order[offset]);
        inc(idx);
      end
      else
        output := output + value[idx];
    end
    else
      output := output + value[idx];    inc(idx);
  end;
  Result := output;
end;exports
    BIG5toGB;{$R *.res}begin
  BIG5Order[0] := $2020;
  BIG5Order[1] := $A3AC;
  BIG5Order[2] := $A1A2;
......
end.