dll项目
library Project2;uses System.ShareMem, System.SysUtils, System.Classes, Winapi.Windows;function Cn2Big(CnStr: string): string; stdcall ;var Len: Integer;begin Len := Length(CnStr); SetLength(Result, Len); LCMapString(GetUserDefaultLCID, LCMAP_TRADITIONAL_CHINESE, PChar(CnStr), Len, PChar(Result), Len);end;function Big2Cn(bigStr: string): string; stdcall ;var Len: Integer;begin Len := Length(bigStr); SetLength(Result, Len); LCMapString(GetUserDefaultLCID, LCMAP_SIMPLIFIED_CHINESE, PChar(bigStr), Len, PChar(Result), Len);end;exports Cn2Big, Big2Cn;beginend.
在项目中第一种调用方式:
type TForm4 = class(TForm) Button1: TButton; edt1: TEdit; edt2: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;var Form4: TForm4;function Cn2Big(CnStr: string): string; stdcall ; external 'Project2.dll';implementationprocedure TForm4.Button1Click(Sender: TObject);begin edt2.Text := Cn2Big(edt1.Text);end;
这种调用方式在dll和项目中都不用shareMem,不爆异常。
第二种调用方式(动态加载dll):
procedure TForm4.Button2Click(Sender: TObject);type TAddc= function(const input: string): string; stdcall;var hh: THandle; addc: TAddc;begin hh:= LoadLibrary('Project2.dll'); try if hh<>0 then @addc:= GetProcAddress(hh, PChar('Cn2Big')); if not (@addc = nil) then begin edt2.Text := addc(edt1.Text); end; finally FreeLibrary(hh); end;end;
在dll和项目中都不用shareMem,报异常。
在dll和项目中都用shareMem,不抛异常。