1个回答
展开全部
动态库链接到应用程序中主要有两种方式:
隐式链接和显式链接。隐式链接是常用方式。
如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。
显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。
步骤:
1. 调用LoadLibrary函数装载DLL并得到模块句柄;
2. 调用GetProcAddress函数获取指定导出函数的指针;
3. 用这个函数的指针调用该函数;
4. 使用完毕后,用FreeLibrary释放DLL。
例子:
HINSTANCE handle; //DLL b模块的句柄
FARPROC lpFarProc;
void (*lpaddit)(int,int,int *);//指向b中函数的指针
int ntemp;
handle = LoadLibrary(″b.dll″); //装载b.dll, 得到该库句柄 b.dll位于当前目录下
lpFarProc = GetProcAddress(handle,″addit″); //得到指向函数addit的指针
lpaddit = (void(__cdecl *)(int, int, int *))lpFarProc; //指针类型转换
lpaddit(2,3,&ntemp); //使用b中的函数
FreeLibrary(handle); //将b.dll从程序中卸掉
隐式链接和显式链接。隐式链接是常用方式。
如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。
显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。
步骤:
1. 调用LoadLibrary函数装载DLL并得到模块句柄;
2. 调用GetProcAddress函数获取指定导出函数的指针;
3. 用这个函数的指针调用该函数;
4. 使用完毕后,用FreeLibrary释放DLL。
例子:
HINSTANCE handle; //DLL b模块的句柄
FARPROC lpFarProc;
void (*lpaddit)(int,int,int *);//指向b中函数的指针
int ntemp;
handle = LoadLibrary(″b.dll″); //装载b.dll, 得到该库句柄 b.dll位于当前目录下
lpFarProc = GetProcAddress(handle,″addit″); //得到指向函数addit的指针
lpaddit = (void(__cdecl *)(int, int, int *))lpFarProc; //指针类型转换
lpaddit(2,3,&ntemp); //使用b中的函数
FreeLibrary(handle); //将b.dll从程序中卸掉
追问
我的DLL已经有了。现在是用C++写一个程序,实现,运行运行A.exe程序,自动把b.dll加载到主程A1.exe并运行.我是想知道这个程序怎么写,具体程序,我不需要删除dll,下次程序运行还用。
追答
以下是一个实际程序中的代码片断!book.dll是一个dll文件,使用时需要配套的有book.lib和book.h,前者把bcb中有个工具可以生成,后者必须由dll提供者提供(可以通过逆向工程得到,很麻烦),bcb中使用时对项目文件也要进行相关处理。
.......
# include "book.h" //对应于book.dll的头文件
............
using namespace book;//book.dll中定义的空间
......
{//程序代码
book::Book * book = xlCreateBook(); //book.dll中定义的类实例化
if(book)
{
book::Sheet * sheet = book->addSheet(Title.c_str()); //book.dll中定义的类的方法
if(sheet)
{
book::Font * TitleFont = book->addFont(); //ibxl.dll中定义的类型
book::Format * TitleFormat = book->addFormat();
TitleFont->setName("宋体");
TitleFont->setSize(24);
} }
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询