动态链接库的连接方式: 显式链接,隐式链接
在命令行下运行当前目录下(如C:\Documents and Settings\Tony\桌面\dll1\Debug),运行命令dumpbin,如果不能运行,说明环境找到损坏,利用vcvars32.bat(VC87 / VC7 目录下Bin 文件夹直接拖入然后运行). 运行dumpbin -exports dll1.dll可以看到DLL中到处函数名.
Code:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dll1.cpp:
_declspec(dllexport) int add(int a, int b )
{
return a+b;
}
_declspec(dllexport)int subtract(int a, int b)
{
return a-b;
}
_declspec(dllexport)表示为导出函数,可供应用程序调用。"extern C"表示,可以使用其他编程语言访问dll中的函数.
编译后可以得到DLL1.DLL文件.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dlltest.dlg
extern int add(int x,int y);
extern int subtract(int x,int y);
//_declspec(dllimport) int add(int a, int b )
//_declspec(dllimport)int subtract(int a, int b) //这样的方法告诉编译器这些函数是从一个dll中调用的函数.编译器就能调用相应的lib文件,提高运行效率
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
CString str;
str.Format("3+5=%d",add(3,5));
MessageBox(str);
编译器工程属性LINK-->input-->additional dependencies 添加相应的lib文件,LINK-->input-->Module defintion file添加def文件.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如何显式的加载一个动态链接库
动态加载不需要lib文件,只需要dll文件即可
HINSTANCE与HMODULE可以通用
HInstance hinst;
hinst = Loadlibrary("dll2.dll"); //显式加载
typedef int (*ADDPROC)(int a , int b); //定义一个函数指针
ADDPROC Add = (ADDPROC)getprocAdress(hinst, "add"); //获得函数指针
if(!add)
{
messagebox("fail");
}
else
{
CString str;
str.Format("3+5=%d",add(3,5));
MessageBox(str);
}
posted on 2007-03-15 15:11
乔栋 阅读(418)
评论(0) 编辑 收藏 引用 所属分类:
C++的健身房