Delphi DLL中函数参数的最大长度?该怎么解决
Delphi DLL中函数参数的最大长度?
工作环境:
Windows XP + Delphi 7
代码如下:
.....(省略)
function MyPost(Url:String;Params: TStrings): String;
begin
Result := 'HelloWorld';
end;
function ProcessDataFile(Url,FileName: Pchar): Pchar;stdcall;
var
Report : TStrings;
begin
Report := TStringList.Create;
try
Report.LoadFromFile(Strpas(filename));
Result := Pchar(MyPost(Strpas(Url),Report));
finally
Report.Free;
end;
end;
exports
ProcessDataFile;
begin
end.
问题是:
每次调用这个DLL,当文件大于3K的时候都会出现地址访问出错。Access Violation at address **** in module "MyDll.dll". Read address ****.
但是相同的函数如果在主程序的空间中就不会出错(把相同的函数放在主程序中),请教各位大虾,这个是什么原因?
------解决方案--------------------
1 Result := Pchar(MyPost(Strpas(Url),Report));
MyPost返回一个字符串,而你又把它转成了pchar这样造成了字符串的生存周期和指针的生存周期不同步,这个习惯很不好,因为字符串变量的生存周期是程序自动控制的,而pchar指针是手动控制的,容易造成访问违规
2 尽量避免在dll做内存申请和释放,可以的话,直接把pchar在exe中申请,然后传入dll
3 MyPost这个函数对传入的内容完全没使用,LZ故意把代码和谐了吧
------解决方案--------------------
我在这里都说过无数遍了
工作环境:
Windows XP + Delphi 7
代码如下:
.....(省略)
function MyPost(Url:String;Params: TStrings): String;
begin
Result := 'HelloWorld';
end;
function ProcessDataFile(Url,FileName: Pchar): Pchar;stdcall;
var
Report : TStrings;
begin
Report := TStringList.Create;
try
Report.LoadFromFile(Strpas(filename));
Result := Pchar(MyPost(Strpas(Url),Report));
finally
Report.Free;
end;
end;
exports
ProcessDataFile;
begin
end.
问题是:
每次调用这个DLL,当文件大于3K的时候都会出现地址访问出错。Access Violation at address **** in module "MyDll.dll". Read address ****.
但是相同的函数如果在主程序的空间中就不会出错(把相同的函数放在主程序中),请教各位大虾,这个是什么原因?
------解决方案--------------------
1 Result := Pchar(MyPost(Strpas(Url),Report));
MyPost返回一个字符串,而你又把它转成了pchar这样造成了字符串的生存周期和指针的生存周期不同步,这个习惯很不好,因为字符串变量的生存周期是程序自动控制的,而pchar指针是手动控制的,容易造成访问违规
2 尽量避免在dll做内存申请和释放,可以的话,直接把pchar在exe中申请,然后传入dll
3 MyPost这个函数对传入的内容完全没使用,LZ故意把代码和谐了吧
------解决方案--------------------
我在这里都说过无数遍了
- Delphi(Pascal) code
function foo: PChar; var x: string; begin ... Result := PChar(x); end.
------解决方案--------------------
DLL中:
- Delphi(Pascal) code
function _MyTestFunc(const AInput: PAnsiChar; AOutput: PAnsiChar): Integer; var S: String; begin S := StrPas(AInput); //…… 任意操作 …… if AOutput = nil then Result := Length(S) else StrPCopy(AOutput, S); end;
------解决方案--------------------
顶楼上
function _MyTestFunc(const AInput: PAnsiChar; AOutput: PAnsiChar): Integer;
AOutput的内存交给调用者去管理
不要下面这样写,内存管理混乱
function _MyTestFunc(const AInput: PAnsiChar): PAnsiChar;