首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi DLL中函数参数的最大长度?该怎么解决

2012-02-28 
Delphi DLL中函数参数的最大长度?工作环境:Windows XP + Delphi 7代码如下:.....(省略)function MyPost(Ur

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故意把代码和谐了吧
[解决办法]
我在这里都说过无数遍了

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;

热点排行