function ZBConnect(PBuff:PChar):Word;
var
    szPassValue: String;
    szAccountID,
    szAccountName,
    szUserName: String;
    szDBName: String;
    iCount,iNum: Integer;
begin
    Result := 0;
    BConnected := False;    DataModuleZB := TDataModuleZB.Create(Application);   
    Application.CreateForm(TFormLogin,FormLogin);
    try        if Formlogin.ShowModal <> idOK then
        begin            BConnected := False;
            Result:=0;
        end else
        begin
            szAccountID := Trim(FormLogin.ComboBoxZT.Text);
            szAccountName := Trim(FormLogin.ComboBoxZT.Text);
            szUserName := Trim(FormLogin.ComboBoxCZY.Text);
            szDBName := Trim(FormLogin.ComboBoxDBName.Text);
            with DataModuleZB.SocketConnectionZB do
            begin
                Connected := False;
                Connected := True;
                if AppServer.NewLogin('',szDBName,'','') then
                begin
                    szPassValue := szAccountID + ' '+ szAccountName + ' '+ szUserName;         
                    StrCopy(PBuff,PChar(szPassValue));
                    BConnected := True;
                    Result:=1;
                end else
                begin
                    MessageDLG('无法与数据库服务器建立连接,请使用安易后台数据管理工具进行自动配置。',mtError, [mbOK],0);
                    DataModuleZB.SocketConnectionZB.Connected := False;
                end;
            end;
        end;
    finally
      Formlogin.Free;
    end

解决方案 »

  1.   

    问题找到了,是释放动态连接库导致调用程序无响应,难道 FreeLibrary(AHandle);不能释放动态连接库?高手请指教!
    procedure TFormDebug.Button1Click(Sender: TObject);
    var
        Connect: TZBConnect;
        szTemp: PChar;
        iRet:Integer;
    begin   AHandle := LoadLibrary('DDZB.Dll');    try
            if AHandle = 0 then
            begin
                MessageDLG('不能装载动态连接库!',mtError,[mbOK],0);
                Exit;
            end;
            Connect := GetProcAddress(AHandle,'ZBConnect');
            if not (@Connect = nil) then
            begin
                szTemp := StrAlloc(256*SizeOf(Char));
                try
                    iRet := Connect(szTemp);
                    //dd := Connect;
                    //ShowMessage(String(szTemp));
                    if iRet = 1 then
                        bconnect := True
                    else
                        bConnect := False;
                finally
                   StrDispose(szTemp);
                end;
            end
            else
                raiseLastwin32Error;
        finally
           FreeLibrary(AHandle);//注释此句,关闭登陆对话框无错,但在关闭调用程序时出错
                                //是有关内存方面的错
        end;
    end;
      

  2.   


    Application.CreateForm(TFormLogin,FormLogin);
    你把这句改成
    TFormLogin.Create 这样来创建试试.
      

  3.   

    halfdream : 谢谢你的回复,但我开始的代码就是你说的那样!
    不知对DLL的调用和释放还有没有其他方法
      

  4.   

    你是登录成功后DLL才释放出错,,还是在几种情况下都会出现释放DLL错误呢?
    哦...感觉有可能问题,好象跟那个数据模块有点关系.或者同那个Socket连接...
      

  5.   

    HalfDream:
    是在登录成功后才释放DLL的才出错,如果调用DLL其他与数据模块无关的FORM不会出错,而且把Login中与数据模块相关的代码注释掉后也不会出错,所以你的说法我比较赞同。但是登录成功后我不能关闭连接,因为我后面还要用到这个连接查询。所以请你以及其他朋友一起再帮我找找原因。再次感谢你的答复!希望有更多的朋友参加,我还会继续加分的!
      

  6.   

    你的问题现在是:在动态连接库中创建了一个变量(socket),但是在登录完毕了还想用它,所以不能关闭,是不是?方法:
    1。要不然你就等到你的变量可以关闭的时候再释放动态连接库,
    2。要不然你就想办法不要在动态连接库中创建这个变量,而是在调用程序中创建,当作参数传入,这个时候可以释放动态连接库。
    3。要不然你就采用什么方法将这个变量保存或者备份一份,然后在关闭变量,释放动态连接库。
    4。要不然你就不要采用动态连接库,不就是个登录窗口嘛,不是非要采用动态连接库才能做啊?!供参考。