posts - 62,  comments - 19,  trackbacks - 0

动态链接库的连接方式: 显式链接,隐式链接

在命令行下运行当前目录下(如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++的健身房

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


My blog is worth $0.00.
How much is your blog worth?