首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

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

2012-03-14 
dll登录窗体,主窗体隐藏,成功登录后显示,给大家看看代码,有没有问题。有几个问题需要确认一下:1、dll里面的

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返回值的返回方法对不对,主程序取它的值方法对不对?
这个取值错了,象楼上说的一样,用个中间变量就可以了

热点排行