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