VC++程序开发中,我们经常要用到自己开发的或者第三方的静态库或者动态库。
1.静态库使用,我们可以使用自己编译的lib库或者第三方lib库,只要把lib文件和头文件放在当前工程,lib文件可以通过#pragma comment(lib,"DLLTest.lib")或者通过vs编辑器工程属性的方式加载,使用lib库时生成.exe文件时,不需要依赖其他文件,会把lib文件编译进exe文件,这样生成的.exe文件就会偏大。
2.动态dll的使用,这里主要讲自己编写的DLL使用,VC++中我们可以把一些大的独立的功能模块编译生产DLL,亦可以把这些DLL使用在其他的工程,这里我们以一个求和的函数为例子。
a)实现讲下静态加载dll的方法,新建一个工程,添加文件
//addNum.h
extern "C" __declspec(dllexport) int addNum(int a,int b);
//addNum.cpp
#include "AddNum.h"
int addNum(int a,int b)
{
return a + b;
}
然后新建一个工程使用这个dll,这里不要引入头文件,代码为:
#include <stdio.h>
#include <Windows.h>
//#include "AddNum.h"
#include <string>
#include <iostream>
using namespace std;
//#pragma comment(lib,"DLLTest.lib")
//extern "C" __declspec(dllimport) int addNumInt(int x,int y);
typedef int (*FUCADDNUM)(int a,int b);
FUCADDNUM pAddNum = NULL;
string addString()
{
string tmp;
tmp += "Hello";
return tmp;
}
int main()
{
HMODULE m_hModule = ::LoadLibrary("E:\\LearnWorkPlace\\DLLTest\\Debug\\DLLTest.dll");
pAddNum = (FUCADDNUM)::GetProcAddress(m_hModule, "addNum");
int tmp = pAddNum(1,2);
//int tmp = addNumInt(2,5);
cout<<addString()<<endl;
//int tmp = addNum(2,6);
printf("addNum: %d\n",tmp);
return 0;
}
这里需要定义函数指针。
b)运行时动态加载dll,代码为:
#include <stdio.h>
#include <Windows.h>
//#include "AddNum.h"
#include <string>
#include <iostream>
using namespace std;
#pragma comment(lib,"DLLTest.lib")
extern "C" __declspec(dllimport) int addNum(int x,int y);
//typedef int (*FUCADDNUM)(int a,int b);
//FUCADDNUM pAddNum = NULL;
string addString()
{
string tmp;
tmp += "Hello";
return tmp;
}
int main()
{
//HMODULE m_hModule = ::LoadLibrary("E:\\LearnWorkPlace\\DLLTest\\Debug\\DLLTest.dll");
//pAddNum = (FUCADDNUM)::GetProcAddress(m_hModule, "addNum");
//int tmp = pAddNum(1,2);
//int tmp = addNumInt(2,5);
cout<<addString()<<endl;
int tmp = addNum(2,6);
printf("addNum: %d\n",tmp);
return 0;
}
这里在不需要头文件时,我们需要自己申明extern "c" __declspec(dllimport) int addNum(int x,int y)才能使用,需要把dll放在EXE目录,不然运行不了,也需要主动连接lib。如果不主动声明,需要包含头文件,DLLMain函数没自己写的话,系统自动会默认生产DLLMain。