dll登录窗体,主窗体隐藏,成功登录后显示,给大家看看代码,有没有问题。

麻酱面条 2011-08-12 09:02:14
有几个问题需要确认一下:

1、dll里面的关闭必须用terminate(),不然主窗体隐藏后需要任务管理器关闭,是不是这样?

2、在主程序的OnCreate里面使form隐藏,如果dll窗体里面直接terminate(),主窗体不会闪烁。Application->ShowMainForm = false;
好像不用放到project文件里面。 对不对?

3、我最关心的一个问题:dll窗体的那个frmAdded返回值的返回方法对不对,主程序取它的值方法对不对?

谢谢!

这是主窗体unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->ShowMainForm = false;
bool addedOK=false;
addedOK=RunExFile("dll1.dll","go");
if(addedOK)
{
Application->ShowMainForm = true;
}
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::RunExFile(char * dllname, char * user) // 外部扩充调用
{ /* 入口格式:调用dll文件名,传递用户名 */
bool OK;
if(FileExists(dllname))
{
boolean PrevValue = IsLibrary; //C++ Builder - Exception 'Need call dxFinalizeGDIPlus before free library!' when using DX components in a DLL
hInstance=LoadLibrary(dllname);
if(hInstance)
{
(FARPROC &) DllWin=GetProcAddress(hInstance,"DllWin");
if(DllWin)
{
OK=DllWin(user);
}
else
{
ShowMessage(" 不能找到函数入口,请重新安装本程序。");
}
}
else
{
ShowMessage("不能载入DLL文件,请重新安装本程序。");
}
FreeLibrary(hInstance);
IsLibrary = PrevValue; //C++ Builder - Exception 'Need call dxFinalizeGDIPlus before free library!' when using DX components in a DLL
}
else
{
ShowMessage(" 相应模块文件丢失,请重新安装本程序。");
}
return OK;
}
//---------------------------------------------------------------------------


这是unit1.h

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
HINSTANCE hInstance;// DLL接口
bool __fastcall RunExFile(char * dllname, char * user); // 外部扩充调用
bool (_stdcall * DllWin)(char * user);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
...全文
83 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigfog 2011-08-13
  • 打赏
  • 举报
回复

extern "C" __declspec(dllexport) bool _stdcall DllWin(char * user)
{
TForm1 * frm=new TForm1(Application,user);
frm->ShowModal();
bool bb=frm->frmAdded;
delete frm; //这里被释放了
return bb;
麻酱面条 2011-08-13
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button1Click(TObject *Sender)
{
frmAdded=true;
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}

大家注意看这两个按钮的区别,我感觉frmAdded=true;的值还是传回去了,不然主窗口不会显示的呀。
麻酱面条 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cppfile 的回复:]
楼上说的是个问题,你访问一个已经删除的对象,会出错的

可以另外导出一个函数,用来删除这个form
[/Quote]

求代码!
麻酱面条 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bigfog 的回复:]
无意中发现一个BUG
extern "C" __declspec(dllexport) bool _stdcall DllWin(char * user)
{
TForm1 * frm=new TForm1(Application,user);
frm->ShowModal();
delete frm; //这里被释放了
return frm->frmAdded; //……
[/Quote]
我用的是BCB6up6,编译的时候也没有错,运行的时候也没有错。好奇怪,我也在想它的值是如何传递回去的?
zzbinfo 2011-08-12
  • 打赏
  • 举报
回复
1、dll里面的关闭必须用terminate(),不然主窗体隐藏后需要任务管理器关闭,是不是这样?

不知道你问的什么意思,但是可以肯定不用terminate(),在窗体的onclose事件力写Action = caFree;

2、在主程序的OnCreate里面使form隐藏,如果dll窗体里面直接terminate(),主窗体不会闪烁。Application->ShowMainForm = false;
好像不用放到project文件里面。 对不对?

对,这个不用放到project里面,放到主窗体的OnCreate

3、我最关心的一个问题:dll窗体的那个frmAdded返回值的返回方法对不对,主程序取它的值方法对不对?
这个取值错了,象楼上说的一样,用个中间变量就可以了

bigfog 2011-08-12
  • 打赏
  • 举报
回复
登入窗口我一般都放在这里

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit3.cpp", Form3);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
       
try
{
Application->Initialize();
SetApplicationMainFormOnTaskBar(Application, true);
//在这里显示登入窗口,并判断返回,如果失败就直接return,退出程序

Application->CreateForm(__classid(TForm3), &Form3);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
CppFile 2011-08-12
  • 打赏
  • 举报
回复
楼上说的是个问题,你访问一个已经删除的对象,会出错的

可以另外导出一个函数,用来删除这个form
bigfog 2011-08-12
  • 打赏
  • 举报
回复
无意中发现一个BUG
extern "C" __declspec(dllexport) bool _stdcall DllWin(char * user)
{
TForm1 * frm=new TForm1(Application,user);
frm->ShowModal();
delete frm; //这里被释放了
return frm->frmAdded; //错误:还被调用
}
//建议用个临时变量过度一下就可以了

麻酱面条 2011-08-12
  • 打赏
  • 举报
回复
这是dll窗体文件 main.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#include <objbase.h>
#include <windows.h>
#include "Unit1.h"
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
CoInitialize(NULL);
}
else if(reason == DLL_PROCESS_DETACH)
{
CoUninitialize();
}
return 1;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) bool _stdcall DllWin(char * user)
{
TForm1 * frm=new TForm1(Application,user);
frm->ShowModal();
delete frm;
return frm->frmAdded;
}


这是dll里面的窗体unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner,char * user)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
frmAdded=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
frmAdded=true;
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------

这是dll窗体头文件unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TButton *Button3;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner,char * user);
bool frmAdded;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧