#include <Windows.h> // 包含 HINSTANCE
#include <iostream>
using namespace std;
int main()
{
HINSTANCE his = LoadLibraryA("to_test1.dll");//用于加载dll
typedef float(*Add)(float a,float b);
Add add1 = (Add)GetProcAddress(his,"add");//GetProcAddress()用于获得函数地址
typedef float(*Min)(float a,float b);
Min add2 = (Min)GetProcAddress(his,"MIN");
cout<<add1(2,3)<<endl;
cout<<add2(2,3)<<endl;
FreeLibrary(his);//释放dll
return 0;
}
静态加载过程:
1)、加载lib文件:
法一:预编译命令#pragma comment(lib,"JsPlayer.lib")
法二:通过资源文件加入lib文件
法三:工程属性——链接器——输入——附加依赖项
2)、包含头文件
3)、dll文件中的函数对于程序可见
#include"func_add_min.h"
int main()
{
cout<<add(1,2)<<endl;
cout<<MIN(1,2)<<endl;
return 0;
}
注意:如果是类的封装,头文件需要做简单的修改
class __declspec(dllexport) NB
{
public:
private:
}
lib文件与dll
(1)lib是编译时需要的,dll是运行时需要的。
如果要完成
源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是
静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在
版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的
函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到
可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的
内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL文件必须随应用程序一起发行,否则应用程序将会产生错误。
加载LIB文件方法
直接加入
在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。
设置工程的 Project Setting
打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的