dll问题,200分征求正解!

lw549 2003-08-18 06:03:02
//这个是dpr的代码
library Project1;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes,
Controls,
PublicArg in 'PublicArg.pas',
ChangePassword in 'ChangePassword.pas' {frmChangePassword};

{$R *.res}

function ChangePassword ( Password : String;
Title : String = '更改密码';
Caption : String = '请输入密码信息';
OldPass : String = '原始密码';
NewPass : String = '更新密码';
ConfPass : String = '确认密码'
) : String; stdcall;
var
Change : TfrmChangePassword;
begin
Result := Password;
try
PasswordString := Password;
Change := TfrmChangePassword.Create( nil );
Change.Caption := Title;
Change.GroupBox1.Caption := Caption;
Change.Label1.Caption := OldPass;
Change.Label2.Caption := NewPass;
Change.Label3.Caption := ConfPass;
Change.ShowModal;
Result := PasswordString;
finally
Change.Free;
end;
end;

exports
ChangePassword;
begin

end.



//form中的全部代码
unit ChangePassword;

interface

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

type
TfrmChangePassword = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmChangePassword: TfrmChangePassword;

implementation

uses
PublicArg;//这是个公共变量的单元,保存的全是变量,不会有问题。
{$R *.dfm}

procedure TfrmChangePassword.Button1Click(Sender: TObject);
begin
//检查原始密码是否正确
if Edit1.Text <> PasswordString then begin
MessageBox( GetActiveWindow, '[原始密码]不正确!', '错误', MB_OK );
Edit1.SetFocus;
Exit;
end;
//检查新密码是否一致
if Edit2.Text <> Edit3.Text then begin
MessageBox( GetActiveWindow, '[更新密码]和[确认密码]不一致!', '错误', MB_OK );
Edit2.SetFocus;
Exit;
end;
PasswordString := Edit2.Text;
MessageBox( GetActiveWindow, '密码更改成功!', '恭喜', MB_OK );
Close;
end;

end.


上面的代码编译成Dll后没有任何问题,完全正常。

但是如果去掉“ Result := PasswordString;//这个很重要”,问题就出来了。
当然大家肯定知道运行的结果会不正确,这个不是我关心的问题,我关心的在下面。

如果你把那条语句“ Result := PasswordString;//这个很重要”去掉,程序就会出现内存不能为read或者write的错误(在你反复调用的时候,而不去掉的话,不会出现错误)

原贴没有得到满意结果,基于信誉分的原因,把那个结了,这里新开一贴:
http://expert.csdn.net/Expert/topic/2151/2151768.xml?temp=.5345117
...全文
21 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lw549 2003-08-18
  • 打赏
  • 举报
回复
解释一下,小枫的观点是dll的内存保护机制导致了这样的错误,这个帖子本来是要给他分的,想借机会向大家验证一下,可惜没人关注,呵呵,不早了,揭贴表示感谢。

希望版主不要删除。这个绝对不是倒粪帖。
lw549 2003-08-18
  • 打赏
  • 举报
回复
FS请放心,揭贴之前我一定会转移到object pascal版的,呵呵。别老说我了。
fengjn 2003-08-18
  • 打赏
  • 举报
回复
先mark一下

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧