动态链接库代码如下:
library DLLSplitString;uses
SysUtils,
Classes;{$R *.res}
// 以下函数实现根据分隔符分隔字符,并将分隔出来的字符写进StringList中。
function SplitString(Source, Deli: string ): TStringList;stdcall;
var
EndOfCurrentString: byte;
StringList: TStringList;
begin
StringList := TStringList.Create;
while Pos(Deli, Source)>0 do
begin
EndOfCurrentString := Pos(Deli, Source);
StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
Result := StringList;
StringList.Add(source);
end;
exports
SplitString; begin
end.程序中调用:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
OneHandle: THandle;
SplitString: function (Source, Deli: string): TStringList; stdcall;
StringList: TStringList;
begin
StringList := TStringList.Create;
OneHandle := LoadLibrary('DLLSplitString.dll'); //动态载入DLL,并返回其句柄
try
if OneHandle <> 0 then //如果载入成功则获取SplitString函数的地址
@SplitString := GetProcAddress(OneHandle, 'SplitString');
if not (@SplitString = nil) then
begin
StringList := SplitString('a;b;c;d', ';');
for i := 0 to StringList.Count - 1 do
edit1.Text := edit1.Text + StringList[i];
end
else
RaiseLastWin32Error;
finally
FreeLibrary(OneHandle); //调用完毕收回DLL占用的资源
end;
end;在执行 FreeLibrary(OneHandle); 之句的时候报错内存地址之类的错。在网上查了一下,可能是说在DLL中使用了全局变量。不知如何改进相关的代码以解决这个问题。
library DLLSplitString;uses
SysUtils,
Classes;{$R *.res}
// 以下函数实现根据分隔符分隔字符,并将分隔出来的字符写进StringList中。
function SplitString(Source, Deli: string ): TStringList;stdcall;
var
EndOfCurrentString: byte;
StringList: TStringList;
begin
StringList := TStringList.Create;
while Pos(Deli, Source)>0 do
begin
EndOfCurrentString := Pos(Deli, Source);
StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
Result := StringList;
StringList.Add(source);
end;
exports
SplitString; begin
end.程序中调用:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
OneHandle: THandle;
SplitString: function (Source, Deli: string): TStringList; stdcall;
StringList: TStringList;
begin
StringList := TStringList.Create;
OneHandle := LoadLibrary('DLLSplitString.dll'); //动态载入DLL,并返回其句柄
try
if OneHandle <> 0 then //如果载入成功则获取SplitString函数的地址
@SplitString := GetProcAddress(OneHandle, 'SplitString');
if not (@SplitString = nil) then
begin
StringList := SplitString('a;b;c;d', ';');
for i := 0 to StringList.Count - 1 do
edit1.Text := edit1.Text + StringList[i];
end
else
RaiseLastWin32Error;
finally
FreeLibrary(OneHandle); //调用完毕收回DLL占用的资源
end;
end;在执行 FreeLibrary(OneHandle); 之句的时候报错内存地址之类的错。在网上查了一下,可能是说在DLL中使用了全局变量。不知如何改进相关的代码以解决这个问题。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货