我想用DLL来读写注册表,用来连接数据库,各位给点建议。我下边写的哪里错了?为什么通不过?编译没问题,但是无法正确运行。
DLL文件:
library PDbDll;
uses
  SysUtils,Windows,Registry,
  Classes;{$R *.res}function GetDataBase(value: integer):string; export;
var
  regcode: TRegistry;
begin
  if value=1 then
    begin
      regcode:= TRegistry.Create;
      Regcode.RootKey:= HKEY_LOCAL_MACHINE;
      if regcode.OpenKey('\system\BloodBank',false) then
        result:= regcode.ReadString('database');
    end;
end;
exports
GetDataBase;begin
end.
//////////////////////
调用程序
unit UDbTest;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    EdServer: TEdit;
    Button1: TButton;
    edDataBase: TEdit;
    edUserName: TEdit;
    edPwd: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
{$R *.dfm}
function GetDataBase(i: integer):string;external'PDbDll.dll';procedure TForm1.Button1Click(Sender: TObject);
var
 ii0:integer;
begin
  ii0:=1;
  edDataBase.Text:= GetDataBase(ii0);
end;end.
/////////////////////
谢谢!

解决方案 »

  1.   

    请参考:
    http://community.csdn.net/Expert/topic/4242/4242766.xml?temp=.3676264Procedure WriteReg;  //写注册表
    var
      reg:Tregistry;
      vServerName, vDataBase, vSa, vPass : String;
    begin
      reg:=Tregistry.create;
      reg.rootkey:=HKEY_LOCAL_MACHINE;
      if reg.openkey('\SOFTWARE\MYSOFT',False) then
      begin
      end
      else begin
        reg.openkey('\SOFTWARE\MYSOFT',True);
        reg.WriteString('vServerName','MYServer');
        Reg.WriteString('vDataBase','DataTest');
        Reg.WriteString('vSa','sa');
        Reg.WriteString('vPass','123456');
        reg.closekey;
      end;
      Reg.Free;
    end;Procedure ReadReg;  //读注册表
    var
      reg:Tregistry;
      vServerName, vDataBase, vSa, vPass : String;
    begin
      reg:=Tregistry.create;
      reg.rootkey:=HKEY_LOCAL_MACHINE;
      if reg.openkey('\SOFTWARE\MYSOFT',False) then
      begin
      end
      else begin
        reg.openkey('\SOFTWARE\MYSOFT',True);
        vServer := reg.ReadString()('vServerName');
        vDataBase := reg.ReadString('vDataBase');
        vSa := Reg.ReadString('vSa');
        vPass :=Reg.ReadString('vPass');
        reg.closekey;
      end;
      Reg.Free;
    end;
      

  2.   

    DLL项目:
    library PDbDll;uses
      SysUtils,Windows,Registry,
      Classes;{$R *.res}function GetDataBase(value: boolean):string;stdcall; export;
    var
      regcode: TRegistry;
    begin
      if value=True then
        begin
          regcode:= TRegistry.Create;
          Regcode.RootKey:= HKEY_LOCAL_MACHINE;
          if regcode.OpenKey('\SoftWare\BloodBank',false) then
            result:= regcode.ReadString('database');
            regcode.CloseKey;
          regcode.Free;
        end;
    end;
    调用方:
    unit UDbTest;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        EdServer: TEdit;
        Button1: TButton;
        edDataBase: TEdit;
        edUserName: TEdit;
        edPwd: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    function GetDataBase(i: boolean):string;stdcall;external'PDbDll.dll' ;{$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
     ii: Boolean;
    begin
      ii:=True;  edDataBase.Text:= GetDataBase(ii);
    end;end.
    //////////////////
    调用的结果都对的,但是提示:Invalid pointer operation.
      

  3.   

    不要返回STRING类型数据,试下用返回PCHAR类型数据应该就行了
      

  4.   

    即动态库中函数function GetDataBase(i: integer):string改为
    function GetDataBase(i: integer):PCHAR