我的例子:
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.

解决方案 »

  1.   

    報什麼錯呢?如果返回是  參數是 String  類型,最好調用者與DLL中都帶上 shareMem  單元,
    具體你看下生成DLL的說明。
      

  2.   

    报写的地址出错.因为我没有调用过Dll,所以也不知道是哪出问题了.
      

  3.   

    当在动态链接库中使用了长字符串类型作为函数的参数、变量或返回值时要应用ShareMem单元,而且必须是第一个被引用的单元。
      

  4.   

    引用ShareMem单元了,运行时还是报write address '00XX...'出错
    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.
      

  5.   

    unit Unit1; interface uses 
      ShareMem,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, StdCtrls, ShellApi, ShlObj; 
    放到最前面。
    DLL中也是。 不過你最好把DLL的單元也拿上來看下。
      

  6.   


      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.
      

  7.   

    上面的各位,问题是我只有dll文件没有代码,
    是报这样的错: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.
      

  8.   

    program Project1; uses 
      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.
    這樣試試。
      

  9.   

    program Project1; uses 
      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.
     用這個試下。
      

  10.   

    还可以把参数类型改为PCahr试试看
      

  11.   

    如果dll给出的形式就是
    Function EnPassWord(PwdValue: String): String; stdcall;
    那我劝你还是不要用了,dll的作者根本就不懂一个通用的dll该怎么设计
      

  12.   

    To:Delphi(Pascal) code
    你好,我用你的代码原原本本考进去用还是报同样的错误,而且一运行就先把到
    begin --运行时先到这里,然后不管按F7,F8,F9哪一个来运行都马上报错.
    Application.Initialize; 
    所以我到现在还搞不清楚是哪出错了.
      

  13.   

    把Login.dll发我 ,我帮你看看。
      

  14.   

    To xiaoxiao_8:
    我已经传给你了。
      

  15.   

    不用看了很简单,你的
    Function EnPassWord(PwdValue: String): String;stdcall;external 'Login.dll'; 
    这句话路径不明确,你的这个工程与Login.dll肯定不在同一目录下,你把他们放在一个文件夹下,或者加上详细的路径名字。
      

  16.   

    兄弟,你给我的Longin.dll文件装载不了。
      

  17.   

    兄弟,你给我的Longin.dll文件装载不了。
      

  18.   

    现在不知道还有多少人在用BCB,我用过两年,
    你的问题应该不是DLL的问题,建议你断点调试,看具体是哪段代码有问题
      

  19.   

    dll有源码不?
    给我传个,我也试试![email protected]
      

  20.   

    dll是不是VC或非Delphi写的呀。。
    如果不是Delphi写的dll,请注意 调用约定和dll中函数名的问题。。由于编译器不同,形成dll的函数名还是不同的。。
    可以使用微软的 Depends 查看一下函数名,之后在调用
      

  21.   

    我觉得吧可以做一下尝试:1.声明中的 string 改为PChar 试一下.
    2.去掉stdcall .
    3.调用的时候不要使用'aaa' 而是使用变量传递.写Dll返回String这种方式尽量避免使用.应该使用 参数传出结果最好.
      

  22.   

    把 stdcall 改成cdecl ,string 改成 phcar;
      

  23.   

    是不是DLL没放在同一个目录下.