CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  VCL组件使用和开发

如何调用DLL文件,添加第三方控件的问题(急,帮帮忙)

楼主mark888(Mark)2006-11-01 00:10:36 在 C++ Builder / VCL组件使用和开发 提问

1、请问BCB怎样使用一个DLL文件,本是是初学都,麻烦说得详细些。  
   
  2、我添加一个控件,主要用作美化窗体,我加了一个xxx.skn文件后,窗改变了。但想改窗体的caption时,编释后改变不了。。。窗体标体还是xxx.skn文件显视的标题,请问如何修改??哪里还有BCB可心的skn文件下载。。。麻烦指点。 问题点数:100、回复次数:7Top

1 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-11-01 08:00:53 得分 20

怎样在C++   Builder中创建使用DLL  
  http://www.ccrun.com/article.asp?i=106&d=r3n13tTop

2 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-11-01 08:01:44 得分 10

http://www.ccrun.com/page.asp?c=2&s=1Top

3 楼ilovechao1314(有点晕了)回复于 2006-11-01 08:20:33 得分 10

1.LoadLibrary  
  2.用vcl   skin的皮肤,这个没有问题Top

4 楼zyyoung(倡导开源)回复于 2006-11-01 08:55:50 得分 10

suipack皮肤Top

5 楼mark888(Mark)回复于 2006-11-01 23:17:42 得分 0

本人是初学者,在问题1中可以再提供详细小小吗???  
   
   
  Top

6 楼h13bk(道人)回复于 2006-11-03 17:57:06 得分 40

问题1:  
   
  一、         动态连接库的创建步骤:         
  1、使用BCB   File|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。         
          2、DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;        
   
  3、在程序中加入自己所要创建的DLL过程、函数;         
   
  4、用dllimport描述出口;     例程序如下:    
   
  #include         
  #pragma   hdrstop         
  extern   “C”   __declspec(dllexport)   int   test();        
  int   WINAPI   DllEntryPoint(HINSTANCE   hinst,   unsigned   long   reason,   void*)    
  {         
                          return   1;    
  }        
  int   test()        
  {         
  return   3;    
  }         
   
  注意:动态链接库中调用过程、函数时有不同的CALL方式   __cdecl、   __pascal,   __fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),如果考虑兼容性可用时__stdcall声明方法为:    
             extern   “C”   __declspec(dllexport)   int   __stdcall   test();    
             对于其中过程、函数也改为:     int   __stdcall   test()        
   
  二、在BCB中使用DLL有两种方法:         
  1、用静态调用法     首先需要在BCB的项目中加入输入接口库(import   library),打开工程项目,使用BCB   View|Project   Manager打开项目列表,向项目中加入接口库(*.lib)。     其次在头文件中加入接口声明。     例程序如下:        //define   in   include   file     extern   “C”   __declspec(dllimport)   int   __cdecl   test();     //use   function   in   main   program     int   I;     I=test();     注意:     (1)动态链接库调用过程、函数时CALL方式   与创建时方式一样不写为__cdecl,其它需要声明。     (2)BCB创建的DLL有对应的输入接口库(import   library),如只有DLL而无库时,可用BCB的implib工具产生:implib   xxx.lib   xxx.dll;另外可用:tlib   xxx.lib,xxx.lst   产生DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。         
  2、动态调用法     动态调用法要用Windows   API   中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函数位置,这种方法较常见。     例程序如下:        HINSTANCE   dd;        int   _stdcall   (*ddd)(void);        dd=LoadLibrary(“xxx.dll”);        ddd=GetProcAddress(dd,“test”);        Caption=IntToStr(ddd());     FreeLibrary(dd);        
   
  三、         注意:         
  创建DLL时编译链接时注意设置Project   Options。     Packages标签:去除Builder   with   runtime   packages检查框。     Linker标签:去除Use   dynamic   RTL检查框。     否则创建的DLL需要Runtime   packages   or   Runtime   library。    
  四、         以上动态连接库不包含类,如果把类加入到动态连接库中,其静态调用方法如下:    
  在创建动态连接库时类的声明使用    
  struct   dllexport   exports    
  {    
  __declspec(dllexport)exports();    
  __declspec(dllexport)~exports();    
  };    
  exports::exports(){}    
  exports::~exports(){}    
  优点:完全和本地的类一样使用,可以直接new/delete.    
  缺点:只能使用自动连接(就是连lib的),自由度不高,不能通过选择dll的方式来转换插件(可以通过替换dll文件实现,但是不能保证对所有的修改后的类通用),继承exports后没有办法通过同一个接口调用子类函数。(因为你永远new的都是父类,除非重新编译原来的main程序。    
  五、         类加入到动态连接库的动态调用方法有两种:    
  1、         通过CreateExports函数动态生成类:    
  这样声明exports类:    
  ;//exports.h    
  struct   exports{    
  friend   exports*   createexports(lpvoid   lpparm);    
  virtual   int   addref();    
  virtual   int   release();    
  virtual   do_sth()=0;    
  protected:    
  exports(){}    
  virtual   ~exports(){}    
  }//注意,需输出的成员函数必须要定义成虚函数    
  extern   "c"   createexports函数是dll的输出函数,只有该输出函数,类不输出。    
  编译exports.cpp成exports.dll    
  然后在main.cpp:    
  #include   "windows.h"    
  #include   "exports.h"    
  void   main()    
  {    
  loadlibrary("exports");....    
  pcreateexports=getprocaddress("createexports"....);...    
  exports*   pex=pcreateexports(null);    
  pex->do_sth();    
  pex->release();    
  }//注意:在调用程序中不必对exports的成员函数进行重新定义,如果定义必须所有虚函数和结构函数都要重新定义(因为只要有一个虚函数或结构函数进行了重定义,编译系统会认为该类不是从其他地方得来,是重新定义的新类,因此所有的函数要重新定义);    
  Top

7 楼h13bk(道人)回复于 2006-11-03 17:59:11 得分 10

问题2,下载一个破解好的vclskin,呵呵Top

相关问题

关键词

得分解答快速导航

  • 帖主:mark888
  • i_love_pc
  • i_love_pc
  • ilovechao1314
  • zyyoung
  • h13bk
  • h13bk

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo