DLL相关注意
Dynamic Library.h
源码如下:
#pragma once
//extern "C" _declspec(dllexport) int _stdcall add(int a=10,int b=10); //利用关键字导出
//extern __declspec(dllexport) int i;
class _declspec(dllexport) DLLTest //利用关键字导出类
{
public:
int a;
DLLTest();
~DLLTest();
};
Dynamic Library.cpp
源码如下:
#include <windows.h>
#include <iostream.h>
#include "Dynamic Library.h"
int i=200;
extern "C" _declspec(dllexport) int _stdcall add(int a,int b)
{
return a+b;
}
extern "C" _declspec(dllexport) int dec(int a,int b)
{
return a-b;
}
DLLTest::DLLTest()
{
cout<<"Construct DLLTest Object"<<endl;
}
DLLTest::~DLLTest()
{
cout<<"Destructor"<<endl;
}
DEF文件中源码:
LIBRARY "Dynamic Library"
EXPORTS
i DATA ;导出全局变量
Link Dynamic.cpp
源码如下:
#include <windows.h>
#include "Dynamic Library.h" //加载静态DLL 或者 静态调用 需要加载头文件
#include <iostream>
using namespace std;
#pragma comment(lib,"Dynamic Library.lib") //连接LIB文件
typedef int (_stdcall *lpAdd)(int a,int b);
typedef int (*lpDec)(int a,int b);
extern _declspec(dllimport) int i; //导入DLL中全局变量
class _declspec(dllimport) DLLTest; //导入DLL中的类
void main()
{
lpAdd addFun;
lpDec decFun;
DLLTest aa;
// cout<<i<<endl;
HINSTANCE hDll=LoadLibrary("Dynamic Library.dll"); //动态加载DLL
addFun=(lpAdd)GetProcAddress(hDll,"_add@8"); //获取函数指针地址
cout<<addFun(1,2)<<endl; //调用DLL函数
decFun=(lpDec)GetProcAddress(hDll,"dec");
cout<<decFun(3,3)<<endl;
FreeLibrary(hDll);
}
以上为调用动态DLL.
注意: 1.Extern "C" 和_stacall 的含义.(命名方式和调用方式)
2.隐式调用需要加载DLL文件和LIB文件以及头文件,用关键字 _declspec(dllimport) 可向预编译文件导入DLL中的对象和类.
3.函数的调用方式要和DLL函数的调用方式一样.