1.如何调用.dll呢?在没编译前可以调用吗?
2.如何设置整个应用的默认字体?如窗体上的lable、edit等等。
3.窗体frmlogin、frmmain,在frmlogin中输入登陆信息打开frmmain,关闭frmmain:
  frmmain.show;
  frmmain.close;
  怎么窗体一闪都不见啦?

解决方案 »

  1.   

    2.如何设置整个应用的默认字体?如窗体上的lable、edit等等。
      将控件的所有ParentFont属性设为true,修改窗体属性3.窗体frmlogin、frmmain,在frmlogin中输入登陆信息打开frmmain,关闭frmmain:
      frmmain.show;
      frmmain.close;
      怎么窗体一闪都不见啦?
      用FrmMain.ShowModal;FrmMain.Free;在FrmMain里面控制自己的关闭。
      

  2.   

    1.动态调用Dll:
    typedef DWORD (WINAPI Fun) (DWORD,DWORD);
      HINSTANCE hkDll=LoadLibrary("KERNEL32.DLL");
      Fun*RegisterServiceProcess=(Fun*)::GetProcAddress(hkDll,"RegisterServiceProcess");
      (*RegisterServiceProcess)(NULL,1);
      FreeLibrary(hkDll);
    ===============
    var
      H: HWnd;
      p: procedure(Handle: THandle; Path: PChar); stdcall;
    begin
            H := LoadLibrary(PChar('shdocvw.dll'));
            if H <> 0 then
              begin
                p := GetProcAddress(H, PChar('DoOrganizeFavDlg'));
                if Assigned(p) then p(Application.Handle, PChar(favpath));
              end;
          FreeLibrary(h); 
    end;
    静态调用
    function GetHandle(rrr:String):Boolean;far;external 'p_chen.dll';
    implementation
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     GetHandle('chen');
    end;
      

  3.   

    rustle():
      谢谢!那有没有设置整个应用中所有对象默认字体的地方? sorry!第三个问题写错啦!
    3.窗体frmlogin、frmmain,在frmlogin中输入登陆信息打开frmmain,关闭frmlogin:
      frmmain.show;
      frmlogin.close;
      怎么窗体一闪都不见啦?
      

  4.   

    chenquan(嘉威王子): 
    我想一个自己的应用程序中除了主程序之外,肯定也有一些自己的dll吧,那主程序和dll的关系是什么?
      

  5.   

    主程序和dll的关系,你先要搞清dll的用处,是为了见少调用,减少内存读取,其实如果你的程序没有很多通用的代码或者长时间驻留在内存的过程可以考虑不用dll也可以
      

  6.   

    你不妨先看看这个,或许对你有所帮助访问DLL库有两种方式,一种是静态引用,另一种是动态引用。
    用静态引用这种方法装入DLL要做两件事情:为DLL 库创建一个输入单元,以及用USES把输入单元连接到要使用DLL 函数的程序模块中。为DLL库创建的输入单元与普通的单元的区别仅在于:在它的接口处声明的过程、函数,并不在它的实现部分给出真正的实现代码,而是用external关键字把过程、函数的实现细节委托给外部DLL模块。
    external命令的使用语法如下:
    procedure /function 过程/函数名;external DLL模块名;
    下面给出为上面创建的minmax.DLL库写的输入单元源文件testdll .pas,从中可看出输入单元 与一般 单元的一些差别,代码如下所示:
    unit testdll;
    interface
    uses
    function Min (X, Y: Integer): Integer;
    function Max (X, Y: Integer): Integer;
     
    implementation
     
    function Min; external ‘minmax.DLL’;
    function Max; external ‘minmax.DLL’;
    end.
     
    一个应用程序若想调用minmax.DLL中的函数,只须在其uses语句中加入testdll 单元即可。
      动态装入DLL,要用到Windows的三个API函数。Loadlibrary、Freelibrary和GetprocAddress 。loadlibrary函数用来装入DLL库,其调用格式如下:
    function loadlobrary (DLLfileName:Pchar): THandle:
    当不再需要一个DLL库时,应调用FreeLibrary函数将其释放,以空出宝贵的内存资源,其调用格式如下:
    procedure FreeLibrary (Libmodule:THandle)
    Libmodule 为由LoadLibrary调用得到的DLL库句柄。在用loadlobrary 函数装入某个DLL库和调用FreeLibrary释放该DLL库之间的程序段中, 可以使用该DLL库中的过程和函数,具体使用方法是:用GetprocAddress函数把DLL库中函数的地址传递给程序中某个函数变量,再用该变量实现DLL函数的调用。GetprocAddress函数声名如下,
    function GetprocAddress (Libmodule:THandle:procname:pchar):TFarProc:
     
    如下例所示:
    type
    TTimeRec = record
    Second: Integer;
    Minute: Integer;
    Hour: Integer;
    end;
    TGetTime = procedure(var Time: TTimeRec);
    THandle = Integer;
    var
    Time: TTimeRec;
    Handle: THandle;
    GetTime: TGetTime;
    ...
    begin
    Handle := LoadLibrary('DATETIME.DLL');
    if Handle <> 0 then
    begin
    @GetTime := GetProcAddress(Handle, 'GetTime');
    if @GetTime <> nil then
    begin
    GetTime(Time);
    with Time do
    WriteLn('The time is ', Hour, ':', Minute, ':', Second);
    end;
    FreeLibrary(Handle);
    end;
    end;
    在调用动态链接库时应注意, 所需动态链接库须与应用程序在同一目录或Windows System 目录下。
      

  7.   

    3.窗体frmlogin、frmmain,在frmlogin中输入登陆信息打开frmmain,关闭frmlogin:
      frmmain.show;
      frmlogin.close;
      怎么窗体一闪都不见啦?是不见了还是关闭了?说清楚一点
      

  8.   

    94,94关于dll的帖子,高手们应该多多关照才是阿
      

  9.   

    myling(阿德):
      是两个窗体都关闭啦!我只想打开frmmain;关闭frmlogin.
      那么在调用dll时还是先编译过才可以,是吗? 
    zhptj(北狼):
      我是想在发布以后,再次修改bug时可以只更新一个dll,而不用把整个应用再编译一遍!
    还有
      既然dll中可以添加窗体,那么为什么只能访问输出的过程或者函数?本人水平实在有限,谢谢各位啦!
      

  10.   

    呵呵,是呀 
    你自己先对动态连接库搞清楚了
    再了解为什么用呀
    其实,有时候做项目根本也不用dll
    关键是看你的工程的具体要求
    一般做网络方面可以多用
    减少exe文件的大小
    每次更新程序,可以只是更新某些动态连接库........
      

  11.   

    1.有没有设置整个应用中所有对象默认字体的地方? 
    2.调用dll时必须是要先编译成.dll过才可以吗?怎么访问在dll中添加的窗体?
    3.窗体frmlogin、frmmain,我想在frmlogin中输入登陆信息打开frmmain,关闭frmlogin:
      frmmain.show;
      frmlogin.close;
      结果是两个窗体都关闭啦。