stdafx.h
targetver.h
dllmain.cpp
LibraryExercise.cpp //工程名
stdafx.cpp
// LibraryExercise.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
_declspec(dllexport) int add(int a, int b)
{
return a + b;
}
#include
//使用库
#pragma comment(lib,"Add.lib")
//声明:此函数需从dll导入
_declspec(dllimport) int Add(int a, int b;)
int main(int argc, char** argv)
{
int result = Add(2, 3);
printf("Result is %d \n", result);
return 1;
}
//export.cpp
#include
static int value = 0;
_declspec(dllexport) void ValueSet(int a)
{
value = a;
}
_declspec(dlliexport) int ValueGet()
{
return value;
}
//import.cpp
#include
#pragma comment(lib, "my.lib")
_declspec(dllimport) int ValueGet();
_declspec(dllimport) void ValueGet(int a);
int main()
{
int a = ValueGet();
printf("Value : %d", a);
ValueSet(120);
int a = ValueGet();
printf("Value : %d", a);
printf("&Value : %f", &Value);
getchar();
return 1;
}
//export.cpp
#include
#define MYDLL _declspec(export)
MYDLL int* MyAlloc(int size)
{
int* p = malloc(size * sizeof(int));
for(int i = 0; i < size; i++)
{
p[i] = i;
}
return p;
}
MYDLL void MyFree(int* p)
{
free(p);
}
//import.cpp
#include
#include
#pragma comment(lib, "my.lib")
#define MyDLL _declspec(import)
MyDLL int* MyAlloc(int size);
MyDLL void MyFree(int* p);
int main(int argc, char** argv)
{
int* p = MyAlloc(4);
free(p); //在dll内分配的动态内存在dll外释放会报错
return 1;
}
//mydll.h
//这个.h文件在编译生成APP的项目和用户实际使用的项目中是通用的,其起作用的方式是条件编译。
#ifndef _MYDLL_H_
#define _MTDLL_H_
#ifdef MYDLL_EXPORT
#define MYDLL _declspec(dllexport) //在编译dll工程的.cpp文件里,定义宏MYDLL_EXPORT
#else
#define MYDLL _declspec(dllimport) //在用户工程的.cpp文件里,什么都不用定义就行了
#endif
#include
MYDLL int Add (int a, int b);
#endif
//mydll.cpp
#define MYDLL_EXPORT //预编译规定“输出选项”,用作编译dll工程里的cpp文件
#include
int Add(int a, int b)
{
return a + b;
}
#include
#include
//此处不需任何其他宏定义,h文件中MYDLL自动被编译为_declspec(import)
#pragma comment(lib, "mydll.lib")
int main(int argc, char** argv)
{
int result = Add(10, 11);
printf("Result : %d", result);
return 1;
}
#include //C++中尖括号表示系统文件,双引号表示用户自己的头文件
//myClassDll.h 在此文件中保存类的定义
#ifndef _MY_CLASS_DLL_H
#define _MY_CLASS_DLL_H
#ifdef MYDLL_EXPORT
#define MYDLL _declspec(dllexport)
#else
#define MYDLL _declspec(dllimport)
#endif
class MYDLL MyObj //整个类的导出和导入只需此处用到MYDLL
{
public:
MyObj(int v);
void display();
private:
int value;
}
#endif
//myClassDll.cpp
#include
#define MYDLL_EXPORT
#include "myClassDll.h"
//在cpp中定义的成员函数无需再使用关键字MYDLL导出
MyObj:: MyObj(int v)
:value(v)
{
}
void MyObj:: diplay()
{
printf("Value: %d", value);
}
//Target.cpp 目标工程cpp
//包含头文件和lib后直接实用类创建对象
#include
#include "myClassDll.h"
#pragma comment(lib, "myClassDll.lib")
int main(int argc, char** argv)
{
MyObj object(123);
object.display();
return 1;
}
// mylib.h 静态库h文件
#ifndef _MYLIB_H_
#define _MYLIB_H_
int Add(int a, int b);
#endif
//mylib.cpp 静态库cpp文件
#include "mylib.h"
int Add(int a, int b)
{
return a + b;
}
//APP.cpp
#include
#include "mylib.h"
#pragma comment(lib, "mylib")
int main(int argc, char** argv)
{
int result = Add(10, 11);
printf("Result : %d", result);
return 1;
}
//mydll.h
#ifndef _MYDLL_H_
#define _MYDLL_H_
#include
#ifdef MYDLL_EXPORT
#define MYDLL _declspec(dllexport)
#else
#define MYDLL _declspec(dllimport)
#endif
extern "C" MYDLL int Add(int a, int b); //将函数声明为一个C函数
#endif
//mydll.cpp
#include "mydll.h"
int Add(int a, int b)
{
return a + b;
}
#include
//包含windows相关头文件
#include
#include
int main(int argc, char** argv)
{
HINSTANCE handle = LoadLibrary("my.dll");
if(handle) //如果动态库加载成功
{
//定义要找的函数原型,用函数指针的形式
typedef int (*DLL_FUNCTION_ADD) (int, int); DLL_FUNCTION_ADD为关键字,括号必须有
//找到目标函数地址
DLL_FUNCTION_ADD dll_func = (DLL_FUNCTION_ADD)GetProcAddress(handle, "Add");
if(dll_func)
{
//调用该函数
int result = dll_func(10,20);
printf("Result : %d", result);
}
}
FreeLibrary(handle);
}
相关英文解释:d——debug、M——Multi-threading(多线程)、T——Text、D——Dynamic