library Project1;
uses
  SysUtils,
  Classes,
  Controls,
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {FrmLogin};//登录对话框;var
  Myconn:string; //定义公共变量,数据库连接字符串{$R *.res}Procedure SetConn(Conn:Pchar);Stdcall;
begin
  Myconn:=StrPas(Conn);
end;function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):Boolean;Stdcall;
var
  FrmLogin:TfrmLogin;
  ResultModal:integer;//窗体返回值
begin
  opID:=pChar(''); opName:=pChar('');opUsername:=pchar('');Result:=false;
  if Myconn='' Then  exit;
  Application.Handle:=Apphandle;
  FrmLogin:=TFrmLogin.Create(nil);
  try
    FrmLogin.ADOQ.ConnectionString:=Myconn;
    ResultModal:=FrmLogin.ShowModal;
    if ResultModal = mrok then
    begin
      opID:=PChar(FrmLogin.SopID);
      opName:=pchar(FrmLogin.Sopname);
      opUsername:=pchar(FrmLogin.sopusername);
      Result:=true;
    end;
  finally
    FrmLogin.Free;
    Application.Handle:=0;
  end;
end;
exports
  SetConn,CheckPass;
begin
end.

解决方案 »

  1.   

    在你的FrmLogin的单元的最后代码的地方end;与end.之间加上.....
    end;
    initialization
      CoInitialize(nil);finalization
      CoUninitialize;
    end.
      

  2.   

    FrmLogin:=TFrmLogin.Create(nil); 
      try 
        FrmLogin.ADOQ.ConnectionString:=Myconn; 
        ResultModal:=FrmLogin.ShowModal; 
        if ResultModal = mrok then 
        begin 
          opID:=PChar(FrmLogin.SopID); 
          opName:=pchar(FrmLogin.Sopname); 
          opUsername:=pchar(FrmLogin.sopusername); 
          Result:=true; 
        end; 
      finally 
        FrmLogin.Free;  <-- FrmLogin被释放了,opUsername,opName,opID的操作会产生不可预料的结果
        Application.Handle:=0; 
      end; 
      

  3.   


    function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar;Conn:Pchar):Boolean;Stdcall;
    var
      FrmLogin:TfrmLogin;
      ResultModal:integer;//窗体返回值
    begin
      opID:=pChar('');
      opName:=pChar('');
      opUsername:=pchar('');
      Result:=false;  if Conn='' Then  exit;
      Application.Handle:=Apphandle;
      FrmLogin:=TFrmLogin.Create(nil);
      try
        FrmLogin.ADOQ.ConnectionString:=Conn;
        ResultModal:=FrmLogin.ShowModal;
        if ResultModal = mrok then
        begin
          opID:=PChar(FrmLogin.SopID);
          opName:=pchar(FrmLogin.Sopname);
          opUsername:=pchar(FrmLogin.sopusername);
          Result:=true;
        end;
      finally
        FrmLogin.Free;
        Application.Handle:=0;
      end;
    end;
    exports
      CheckPass;
    begin
    end.
      

  4.   


    //DLL部分
    library Project1;
    uses
      SysUtils,
      Classes,
      Forms,
      Controls,  Unit1 in 'Unit1.pas' {FrmLogin};var
      Myconn:string;
    {$R *.res}
    Procedure SetConn(Conn:Pchar);Stdcall;
    begin
      Myconn:=StrPas(Conn);
    end;function CheckPass(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):Boolean;Stdcall;
    var
      FrmLogin:TfrmLogin;
      ResultModal:integer;//窗体返回值
    begin
      Result:=false;
      if Myconn='' Then  exit;
      Application.Handle:=Apphandle;
      FrmLogin:=TFrmLogin.Create(nil);
      try
        FrmLogin.ADOQ.ConnectionString:=Myconn;
        ResultModal:=FrmLogin.ShowModal;
        if ResultModal = mrok then
        begin
           StrPCopy(opID,FrmLogin.SopID.Text);
           StrPCopy(opName,FrmLogin.Sopname.Text);
           StrPCopy(opUsername,FrmLogin.sopusername.Text);
           Result:=true;
        end;
      finally
        FrmLogin.Free;
        Application.Handle:=0;
      end; 
    end;
    exports 
      SetConn,CheckPass; begin
    end.
    //什么时候真正用到ADO操作,那么要及时进入套间,来初始化一下其工作环境
    //调用程序
    type
      TSetConn=procedure (Conn:Pchar);stdcall;
      TCheckPass=function(Apphandle:THandle;var opID:pchar;var opName:pchar;var opUsername:pchar):boolean;stdcall;procedure TForm1.GetLogonForm;
    var
      DllHnd: THandle;
      SetConn: TSetConn;
      CheckPass:TCheckPass;
      opID,opName,opUsername: PChar;
      size:Integer;
    begin
      size:=255;
      DllHnd := LoadLibrary(PChar('project1.dll'));
      try
        if (DllHnd <> 0) then
        begin
          @SetConn :=GetProcAddress(DllHnd, 'SetConn');
          if (@SetConn<>nil) then
          begin
            SetConn('Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CSDNTest;Data Source=.');
            @CheckPass :=GetProcAddress(DllHnd, 'CheckPass');
            if (@CheckPass<>nil) then
            begin
              GetMem(opID,size);
              GetMem(opName, size);
              GetMem(opUsername,Size);
              try
                if CheckPass(Application.Handle,opID,opName,opUsername) then
                showmessage('ok');          finally
                FreeMem(opID);
                FreeMem(opName);
                FreeMem(opUsername);
              end;
            end;
          end
          else
          begin
            application.MessageBox(PChar('DLL加载出错,DLL可能不存在!'), PChar('错误'),
              MB_ICONWARNING or MB_OK);
          end;
        end;
      finally
        FreeLibrary(DllHnd);
      end;
    end;