0
点赞
收藏
分享

微信扫一扫

c/c++动态库编写

vs程序向导选择dll,方法与静态连接库类似

//testdll.h

#pragma once

#ifndef TESTDLL_H_//

#define TESTDLL_H_

#ifdef _DLLAPI

#define DLLAPI _declspec(dllexport)//导入和导出是不一样的,可以在此工程预处理器定义_DLLAPI

#else

#define DLLAPI _declspec(dllimport)//默认不设置预处理定义则会使用导入

#endif

//

//int DLLAPI add(int, int);//cpp导出动态库会自动修改函数名

//int DLLAPI sub(int, int);

extern "C" DLLAPI int  add(int, int);//强制用C语言的导出动态库,防止编译器修改函数名

extern "C" DLLAPI int sub(int, int);

#endif

使用dependency软件可查看编译后的dll文件



//C:\Windows\SysWOW64将生成的.dll文件放置到该路径或者system32或者可执行文件的目录下

//引用动态链接库

#include

#include "testdll.h"//再VC++目录中包含

#include <windows.h>//显示加载动态库所需头文件

typedef int(*PADD)(int a, int b);//创建函数指针

typedef int(*PSUB)(int a, int b);

//#pragma comment(lib,"testdll.lib")//隐式调用零一种方法是显式调用

int main()

{

HMODULE hDLL = LoadLibrary(L"./testdll.dll");//加载动态库,路径可以是绝对可以是相对

if (NULL == hDLL)

{

 printf("动态库加载失败");

 return 0;

}

PADD pAdd = (PADD)GetProcAddress(hDLL, "?add@@YAHHH@Z");//用函数名加载函数所在的地址具体由dependency软件查看DLL文件可知,这种相对安全

PSUB pSub = (PSUB)GetProcAddress(hDLL, "?sub@@YAHHH@Z");//.cpp会自动帮我们修改,.c文件编译的则不会帮我们修改

printf("%d\n", pAdd(5, 6));

printf("%d\n", pSub(7, 2));

FreeLibrary(hDLL);//释放动态库

}

举报

相关推荐

0 条评论