我的例子:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi, ShlObj;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end;var
Form1: TForm1;implementation
{$R *.dfm}
Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll';procedure TForm1.Button1Click(Sender: TObject);
var
sPwdValue: String;
begin
sPwdValue := EnPassWord('AAA');
//showmessage(sPwdValue);
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi, ShlObj;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end;var
Form1: TForm1;implementation
{$R *.dfm}
Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll';procedure TForm1.Button1Click(Sender: TObject);
var
sPwdValue: String;
begin
sPwdValue := EnPassWord('AAA');
//showmessage(sPwdValue);
end;end.
具體你看下生成DLL的說明。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi, ShlObj,ShareMem;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end;var
Form1: TForm1;implementation
{$R *.dfm}
Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll';procedure TForm1.Button1Click(Sender: TObject);
var
sPwdValue: String;
begin
sPwdValue := EnPassWord('AAA');
//showmessage(sPwdValue);
end;end.
ShareMem,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi, ShlObj;
放到最前面。
DLL中也是。 不過你最好把DLL的單元也拿上來看下。
ShareMem must be the
first unit in your library's USES clause AND your project's
program Project1;uses
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1};{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
是报这样的错:faulted message:'Access violation at 0x7c957a50;write of address 0x0040d28'.process stopped. use stop or runto continue.。而且代码是这样的:
program Project1;uses
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1};{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShareMem{, ShellApi, ShlObj,ShareMem};type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end;var
Form1: TForm1;
implementation
{$R *.dfm}
Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll';procedure TForm1.Button1Click(Sender: TObject);
var
sPwdValue: String;
begin
sPwdValue := EnPassWord('AAA');
showmessage(sPwdValue);
end;end.
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end. unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShareMem{, ShellApi, ShlObj,ShareMem}; type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end; var
Form1: TForm1;
implementation
{$R *.dfm}
Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll'; procedure TForm1.Button1Click(Sender: TObject);
var
sPwdValue: String;
begin
sPwdValue := EnPassWord(PAnsiChar('AAA'));
showmessage(sPwdValue);
end; end.
這樣試試。
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end. unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShareMem{, ShellApi, ShlObj,ShareMem}; type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public { Public declarations }
end; var
Form1: TForm1;
implementation
{$R *.dfm}
Function EnPassWord(PwdValue: pAnsichar ): String;stdcall;external 'Login.dll'; procedure TForm1.Button1Click(Sender: TObject);
var
sPwdValue: String;
begin
sPwdValue := EnPassWord(PAnsiChar('AAA'));
showmessage(sPwdValue);
end; end.
用這個試下。
Function EnPassWord(PwdValue: String): String; stdcall;
那我劝你还是不要用了,dll的作者根本就不懂一个通用的dll该怎么设计
你好,我用你的代码原原本本考进去用还是报同样的错误,而且一运行就先把到
begin --运行时先到这里,然后不管按F7,F8,F9哪一个来运行都马上报错.
Application.Initialize;
所以我到现在还搞不清楚是哪出错了.
我已经传给你了。
Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll';
这句话路径不明确,你的这个工程与Login.dll肯定不在同一目录下,你把他们放在一个文件夹下,或者加上详细的路径名字。
你的问题应该不是DLL的问题,建议你断点调试,看具体是哪段代码有问题
给我传个,我也试试![email protected]
如果不是Delphi写的dll,请注意 调用约定和dll中函数名的问题。。由于编译器不同,形成dll的函数名还是不同的。。
可以使用微软的 Depends 查看一下函数名,之后在调用
2.去掉stdcall .
3.调用的时候不要使用'aaa' 而是使用变量传递.写Dll返回String这种方式尽量避免使用.应该使用 参数传出结果最好.