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