Dll返回字符长度只有12458???如何让数据返回更多(100分)

  • 主题发起人 主题发起人 死灰
  • 开始时间 开始时间

死灰

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的代码编译成DLL后调用只返回了12458个字符号。。如何让数据返回更多呢?
Function TestFunc():Pchar;stdcall;
var
GetStr : String;
i : Integer;
begin
For i:= 1 to 100000 Do
GetStr := GetStr + 'a';
Result := Pchar(GetStr);
Exit;
End;
exports
TestFunc;
 
用 Byte 数组看,中间不能有 $0
 
Function TestFunc():WideString;stdcall;
 
不能用WideString啊。。做成的DLL不一定只是delphi使用。
 
var
GetStr : PChar;
Function TestFunc():Pchar;stdcall;
var
i : Integer;
begin
getmem(GetStr, 100000);
For i:= 1 to 100000 Do
GetStr := 'a';
Result := GetStr;
Exit;
End;
exports
TestFunc;
自己测试一下看看,我没测试。
记得自己释放内存啊!!
 
//dll部分
library dllmem;

uses
SysUtils,
Classes;

var
G_Buffer: PChar;
{$R *.res}
function AlloMem: PChar;
var
I: Integer;
begin
GetMem(G_Buffer, 100000);
for I := 0 to 99999 do
G_Buffer := 'A';
Result := G_Buffer;
end;
function DealMem: Integer;
begin
Result := 0;
try
FreeMem(G_Buffer, 100000);
except
Exit;
end;
Result := 1;
end;
exports
AlloMem,
DealMem;
begin
end.

//调用部分
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Math;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
type
TAlloMem = function: PChar;
TDealMem = function: Integer;
var
AlloMem: TAlloMem;
DealMem: TDealMem;
dllHandle: Cardinal;
Ph: PChar;
begin
dllHandle := LoadLibrary(PChar('F:/guiganghospMS/testdll/新建文件夹/dllmem.dll'));
If dllHandle <= 0 then Exit;
AlloMem := GetProcAddress(dllHandle, Pchar('AlloMem'));
DealMem := GetProcAddress(dllHandle, Pchar('DealMem'));
if (@AlloMem = nil) or (@DealMem = nil) then
begin
FreeLibrary(dllHandle);
Exit;
end;
try
Ph := AlloMem; {dll分配内存}
ShowMessage(IntToStr(length(StrPas(Ph)))); //返回了100000
finally
DealMem; {dll释放内存}
end;
end;
end.
 
来自:死灰, 时间:2006-9-22 6:56:27, ID:3578707
不能用WideString啊。。做成的DLL不一定只是delphi使用。

WideString不是只在Delphi里面使用的
 
Dll想传长字符串,只能分配、释放内存。GetMem等.
 
^_^,帮你顶一下吧~
 
用内存映射文件,你想多少就多少
 
我估计是栈溢出,最好定义全局,防备栈溢出
可以看看我的关于堆栈的笔记
http://www.delphibbs.com/keylife/iblog_show.asp?xid=24204

下面代码没有测试,应该没有问题
{$R *.res}

var
F_ReturnName: string;

Function TestFunc():Pchar;stdcall;
var
GetStr : String;
i : Integer;
begin
Result := nil;
F_ReturnName :='';
For i:= 1 to 100000 Do
F_ReturnName := F_ReturnName + 'a';
Result := @F_ReturnName[1];
Exit;
End;

exports
TestFunc;
 
后退
顶部