dll登录窗体,主窗体隐藏,成功登录后显示,给大家看看代码,有没有问题。
有几个问题需要确认一下:
1、dll里面的关闭必须用terminate(),不然主窗体隐藏后需要任务管理器关闭,是不是这样?
2、在主程序的OnCreate里面使form隐藏,如果dll窗体里面直接terminate(),主窗体不会闪烁。Application->ShowMainForm = false;
好像不用放到project文件里面。 对不对?
3、我最关心的一个问题:dll窗体的那个frmAdded返回值的返回方法对不对,主程序取它的值方法对不对?
谢谢!
这是主窗体unit1.cpp
- C/C++ code
//---------------------------------------#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
- C/C++ code
#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 declarationspublic: // 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[解决办法]
无意中发现一个BUG
extern "C" __declspec(dllexport) bool _stdcall DllWin(char * user)
{
TForm1 * frm=new TForm1(Application,user);
frm->ShowModal();
delete frm; //这里被释放了
return frm->frmAdded; //错误:还被调用
}
//建议用个临时变量过度一下就可以了
[解决办法]
楼上说的是个问题,你访问一个已经删除的对象,会出错的
可以另外导出一个函数,用来删除这个form
[解决办法]
1、dll里面的关闭必须用terminate(),不然主窗体隐藏后需要任务管理器关闭,是不是这样?
不知道你问的什么意思,但是可以肯定不用terminate(),在窗体的onclose事件力写Action = caFree;
2、在主程序的OnCreate里面使form隐藏,如果dll窗体里面直接terminate(),主窗体不会闪烁。Application->ShowMainForm = false;
好像不用放到project文件里面。 对不对?
对,这个不用放到project里面,放到主窗体的OnCreate
3、我最关心的一个问题:dll窗体的那个frmAdded返回值的返回方法对不对,主程序取它的值方法对不对?
这个取值错了,象楼上说的一样,用个中间变量就可以了