关于动态链接库的学习经验
//3个动态链接库
//user32.dll
//gdi32.dll
——————作用
//共享资源
//本地化资源
//感谢小金鱼老师
加载方式:
//申明可导方式
C++标准
#ifdef API_EXPORT
//导出 采用宏定义容易
#define DLL_EXPORT __declspec(dllexport)
#else
//导入
#define DLL_EXPORT __declspec(dllimport)
#endif
C标准
#ifdef API_EXPORT
//导出 采用宏定义容易
#define DLL_EXPORT extern "C" __declspec(dllexport)
#else
//导入
#define DLL_EXPORT extern "C" __declspec(dllimport)
#endif
//包含链接库方式
#pragma comment(lib,"FilePath.lib")
/——————————-隐式————————————/
#include "related head files"
#pragma comment(lib,"FilePath.lib")
/——————————-显式————————————/
//获得句柄
HINSTANCE hInstance = LoadLibrary(_T("DllText.dll"));
//获得链接库中指定函数
GetProcAddress(hInstance, "Add");
//消除句柄
FreeLibrary(hInstance);
//————————————————————————-
//——–实例———–显示———-
//链接库
//.h
#pragma once
#ifdef API_EXPORT
#define DLL_EXPORT extern "C" __declspec(dllexport)
#else
#define DLL_EXPORT extern "C" __declspec(dllimport)
#endif
DLL_EXPORT int Add(int a, int b);
//.cpp
#define API_EXPORT
#include "math.h"
int Add(int a, int b)
{
return a + b;
}
//链接库函数
#include <iostream>
BOOL APIENTRY DllMain
(
HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserve
)
{
return TRUE;
}
//应用程序
//.cpp
#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <assert.h>
using namespace std;
//函数指针
typedef int(*Fun)(int, int);
int main()
{
HINSTANCE hInstance = LoadLibrary(_T("DllText.dll"));
assert(hInstance);
Fun Add = (Fun)::GetProcAddress(hInstance, "Add");
if (Add)
{
cout << Add(1, 2);
}
getchar();
FreeLibrary(hInstance);
}