DLL字符串函数调用时的存取异常(不是高手别来)(200分)

  • 主题发起人 主题发起人 2zhenggang
  • 开始时间 开始时间
2

2zhenggang

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Delphi生成一个DLL,如下:
library Test
uses
; ShareMem,
; ...

function ConvrtStr(const Source: AnsiString; var Dest: AnsiString): boolean;
begin
...
end;

exports
; ...
; ConvrtStr;

begin
; ...
end;

然后建立另一个exe文件调用该Dll,现在发生了下面的问题:
当Dest的长度较短时,程序一切正常。
当Dest的长度较长时(如大于2000),调用程序生成一个存取异常???!!!
何解?
知情通报者,赏大洋200!!
 
是不是与函数参数传递方式有关,函数的前三个参数是存放在寄存器中的,以加快执行,
难道是dest的长度益出;建议增加参数个数,把dest作为第四个值参,试一下能否找出原
因?此处仅供测试!
 
先别乱放毒,测试通过了再发贴,最恨这种人了!扰乱视听!
 
你大概属于饭来张口,衣来伸手的那种人!
 
sorry,更正一下:
Dll中的声明
function ConvrtStr(...); stdcall;
所以参数并没有放在寄存器中
 
最好把你的實現語句﹐和調用語句都放上來
說不定是其中有問題呢
 
onlyonekgx:
; 200分会是这么弱智的问题?PChar我早就试过了,死个更惨。你这样回答等于没有,搞的后面的人认为你已经回答,结果阻挡了更高质量的回贴
另:
; 我是在Windows 2000 server编译的
 
//Dll 文件
library Project1;
uses
; ShareMem,
; SysUtils,
; Classes;

{$R *.RES}
function ConvrtStr(const Source: AnsiString; var Dest: AnsiString): boolean; stdcall;
begin
; Result := False;
; Dest := Concat(Source,Source, Source, Source);
; Result := True;
end;

exports
; ConvrtStr;

begin

end.

//调用程序
unit unCall;
....
type
; TConvrtStr = function(const Source: AnsiString; var Dest: AnsiString): boolean; stdcall;
...

procedure TForm1.Button1Click(Sender: TObject);
var
; dllHandle: THandle;
; fCnvrt: TConvrtStr;
; Dest: AnsiString;
begin
; dllHandle := LoadLibrary('Project1.dll');
; if dllHandle <> 0 then
; begin
; ; @fCnvrt := GetProcAddress(DllHandle,'ConvrtStr');
; ; if @fCnvrt <> nil then
; ; begin
; ; ; fCnvrt(Memo1.Lines.Text,Dest);
; ; ; Memo2.Lines.Text := Dest;
; ; end;
; ; FreeLibrary(dllHandle);
; end;
end;
有兴趣的可以试一下
 
我直接采用string,20M的都没有错过!
 
嘿嘿嘿,好像行了,
在Dll里面uses 的下面直接添上ShareMem,注意,必须是第一个(好像是的)
在调用的模块的dpr里面也填上ShareMem,同样需要是第一个。注意是dpr文件。
我实验了一下,没有异常。
不知道操作中是否有多余的。
 
2zhenggang,不知道你是否测试了,我上面说的是测试过的,
刚才我将这个网页Ctrl+A、Ctrl+C了一次,然后Ctrl+V到Memo1中,结果Memo2告诉我容量不够了。
只要使用剪贴板了,结果证明,没错!
退出,也没有任何异常!
 
yzhshi:
; 谢谢你这么热心,一般来说执行第一次没有问题。但是执行第二遍就有问题了,不信你再试一试
 
不知你那根筋有问题,在程序没贴出来前,谁知你那有病!
我测试过了,执行过多次,没问题,要不要发个给你测试一下;
 
呵呵,说的没错
delphi in nut shell里说:
; 如果库需要将字符串,动态数组或Variant作为变量传递,或者是在模块
; ; (应用程序或其他的库)之间返回值,必须使用shareMem作为第一个单元。
; 如果库分配了由应用程序或其他的库释放的内存(例如对象),或者是库释放了
; ; 一个由不同的模块分配的对象,必须使用shareMem单元

不要是不想给分吧
 
to 2zhenggang,我执行了n次了,呵呵,都没有bug呀。
真的,说实话,这也是我第一次使用String传递参数的。
 
多人接受答案了。
 
后退
顶部