导出函数的概念
为什么要导出函数,导出来用来干什么?
前面我们说过,初识DLL,当我们执行某一个程序的时候,相应的dll文件会被调用,一个程序可以调用多个dll,一个dll也可以被多个应用程序调用
那么它是调用了全部的东西吗,还是调用了内部一些不为人知的东西 举一个例子: 你去便利店买水果,你和售货员说,你要买下整个便利店,那么她还以为你是个神经病,肯定不会卖,你要的仅仅只是水果,却和售货员说是买下整个店,店里东西很多:水果🍎,床上用品,蔬菜🥦,玩具✈,饮料🍸.....而你只需要买你需要的。 相对于dll文件给我们提供一个接口让外部的应用程序去调用
先在CLion中创建一个C++ library工程,写好DLLMain()函数入口
#include "library.h"
#include <iostream>
#include <windows.h>
//用做导出的函数
void print(){
printf("这是一个导出函数");
}
// 核心的入口函数 dll文件
bool WINAPI DllMain(HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpReserved )
{
switch( fdwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE; //函数返回
}
如果想导出函数,让其作为接口以供其他应用程序调用 需要在导出函数的函数声明前,加上代码:
//导出函数 void printf()
extern "C" __declspec(dllexport) void print();
extern "C"
- C++调用C语言代码
- 在C++的头文件中使用
- 在多个人协作开发,有人擅长C,有人擅长C++,不一
extern "C" 的主要作用就是为了能够正确实现C++代码能够调用其他C语言代码,加上extern "C"后,编译器会将这部分代码当作C语言来编译,而不是C++
由于C++支持函数重载,因此编译器编译函数的时候也会将函数的参数模型加载到函数编译后的代码中,而不仅仅是函数明,而C语言不支持函数重载,因此编译C语言的代码的函数不会带上函数的参数模型,一般不包括函数名。
因为C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码,和已经写好了的C语言库,所以就希望C++更可能的支持C,而extern "C" 就是其中的一个策略 简单概括一下就是:防止编译后函数名被编译器修改或者粉碎
__declspec(dllexport):声明导出函数,将该函数从本DLL导出供其他模块使用。