About ' DLL ' something (孙鑫VC 19讲 DLL)

About ' DLL ' something (孙鑫VC 19讲 DLL)

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

在命令行下运行当前目录下(如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);
}








你可能感兴趣的:(About ' DLL ' something (孙鑫VC 19讲 DLL))