简单问题:我做的窗体不能最小化了。(200分)

  • 主题发起人 主题发起人 Xelloss
  • 开始时间 开始时间
X

Xelloss

Unregistered / Unconfirmed
GUEST, unregistred user!
我用D7做的应用程序
在创建主Form前,调用了一个DLL中的登录函数(通过形参返回中间层对象)。
程序启动以后,最小化按钮就失效了(最大化和还原没问题)。

DLL中有一个登录界面,登录成功就返回中间层(COM+)对象,释放界面。

一旦去掉DLL调用,就一切OK。
怎么回事?百思不得其解,兄弟们帮我一把。
 
看看你的代码?
是不是改了Application的什么东西
 
关键在dll中,帖出dll代码!
 
拿出 dll来
 
DLL代码太长,只贴出主要的(调用函数)。
各位帮帮忙,不胜感激。
function Login60(var aUserInfo: TUserInfo; var aBasedata: IcoBaseBusiness): BOOLEAN;
var
Reg: TRegistry;
aErrMsg: WideString;
begin
CoInitialize(nil);
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey(C_REG_EILOGPATH, true);
if ValueExists('AutoLogin') then
iAutoLogin := ReadInteger('AutoLogin');
if ValueExists('LastLoginName') then
sLastLoginName := ReadString('LastLoginName');
if ValueExists('LastLoginPassword') then
try
sLastLoginPassword := cl_decrypt(ReadString('LastLoginPassword'));
except
sLastLoginPassword := '';
end;
if ValueExists('LastLoginServer') then
sServer := ReadString('LastLoginServer');
if ValueExists('LoginNameList') then
sLoginNameList := ReadString('LoginNameList');
end;
if iAutoLogin = 1 then
begin
aUserInfo.LoginName := sLastLoginName;
aUserInfo.Password := sLastLoginPassword;
if BLogin(aUserInfo, aBasedata, aErrMsg, sServer) then
begin
IsLoginSuccess := true;
Result := true;
Reg := nil;
CoUninitialize;
Exit;
end
else
MessageDlg(aErrMsg, mtError, [mbOK], 0);
end;
FrmLogin := TFrmLogin.Create(nil);
try
FrmLogin.fUserInfo := aUserInfo;
FrmLogin.Caption := '用户登录——当前服务器[' + sServer + ']';
if iAutoLogin = 1 then
FrmLogin.CkbAutoLog.Checked := true;
FrmLogin.CbxLoginName.Items.CommaText := sLoginNameList;
FrmLogin.CbxLoginName.Text := sLastLoginName;
FrmLogin.EdtPassword.Text := '';
FrmLogin.ShowModal;
aUserInfo := FrmLogin.fUserInfo;
aBasedata := gBasedata;
gBasedata := nil;
except
end;
FrmLogin.Free;
finally
Result := IsLoginSuccess;
Reg.Free;
CoUninitialize;
end;
end;
 
使用自动登录(iAutoLogin = 1 )就会有问题。
function BLogin(var aUserInfo: TUserInfo; var aBasedata: IcoBaseBusiness; var ErrMsg: WideString; aServer: String): BOOLEAN;
var
sRightList, sErrMsg, sTemp, sUserName: WideString;
VarParam: OleVariant;
begin
Result := false;
ErrMsg := '';
try
if aBasedata = nil then
aBasedata := cocoBaseBusiness.CreateRemote(aServer);
if not aBasedata.DataLinked then
if not aBasedata.OpenDataLink(ErrMsg) then Exit;
if aBasedata.GetUserRight(aUserInfo.LoginName, aUserInfo.Password, VarParam, aUserInfo.UserID, sUserName, sRightList, sErrMsg, sTemp, VarParam) then
begin
aUserInfo.UserName := sUserName;
aUserInfo.RightIDList := sRightList;
Result := true;
end
else
ErrMsg := sErrMsg;
except
ErrMsg := '服务器连接错误!';
end;
end;
 
DLL能顺利通过,但主程序只能最大化,不能最小化。
主程序:
function Login60(var aUserInfo: TUserInfo; var aBasedata: IcoBaseBusiness): BOOLEAN; external 'UserLogin60.dll';

begin
Application.Initialize;
if not Login60(gUserInfo, gBasedata) then
begin
gBasedata := nil;
Application.Terminate;
Exit;
end;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
 
问题出在FrmLogin := TFrmLogin.Create(nil);
我原来编程也准备模块,把不同的Form放在DLL中,后来发现问题实在多,只好放弃。
真正的问题在用Delphi编写DLL,一不小心就生成了Application对象,变得主程序
有一个Application,DLL 中也有一个Application,处理非常麻烦。
 
to chnplzh
可是 根本没有执行到 FrmLogin := TFrmLogin.Create(nil);

函数在前面 自动登录成功后 就Exit了。
 
问题解决了!!!

只要动态调用DLL就可以了!!
或许是静态调用时,DLL装载过早,导致他截获了Application的消息。
 
后退
顶部