如何调用DLL文件,添加第三方控件的问题(急,帮帮忙)
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




