在需要导出的函数之前加__declspec(dllexport)即可。
#include
using namespace std;
__declspec(dllexport) int add(int a, int b)
{
return a + b;
}
__declspec(dllexport) int sub(int a, int b)
{
return (a - b);
}
显式链接还需加上extern "C",否则必须调用者必须使用一个处理后的字符串进行调用,具体在下文使用DLL中。
C++代码:
#include
using namespace std;
int _stdcall add(int a, int b)
{
return a + b;
}
int __stdcall sub(int a, int b)
{
return a - b;
}
新建一个DllDef.def文件,内容是
LIBRARY DllDef
EXPORTS
add
sub
显式链接不需要.h和.lib,只需dll即可。显式链接在需要时LoadLreeibrary不需要时FreeLibrary即可。
隐式链接需要.h和.lib和.dll,且dll随主进程始终占用内存。
1、def声明
#include
#include
#include
using namespace std;
typedef int(_stdcall* Add)(int, int);
int main()
{
HINSTANCE hInstance = LoadLibrary(TEXT("DllDef.dll"));
if (!hInstance)
{
cout << "not found" << endl;
return 0;
}
Add add = (Add)GetProcAddress(hInstance, "add");
if (add == NULL)
{
cout << "GetProcAddress Error" << GetLastError() << endl;
return 0;
}
cout << add(1, 2);
FreeLibrary(hInstance);
return 0;
}
可以正常使用。
2、在函数声明中加上__declspec(dllexport)
不改变原来的代码,直接编译,成功,但是运行会报错127(找不到指定的程序)。
所以需要修改dll生成那里的代码函数声明加上extern "C"
#include
using namespace std;
extern "C" __declspec(dllexport) int add(int a, int b)
{
return a + b;
}
extern "C" __declspec(dllexport) int sub(int a, int b)
{
return a - b;
}
然后修改代码去掉_stdcall
#include
#include
#include
using namespace std;
typedef int(* Add)(int, int); //这里进行了改动,去掉了_stdcall
int main()
{
HINSTANCE hInstance = LoadLibrary(TEXT("DllDef.dll"));
if (!hInstance)
{
cout << "not found" << endl;
return 0;
}
Add add = (Add)GetProcAddress(hInstance, "add");
if (add == NULL)
{
cout << "GetProcAddress Error:" << GetLastError() << endl;
return 0;
}
cout << add(1, 2);
FreeLibrary(hInstance);
return 0;
}
前面加上#pragma comment(lib,"xxx.lib")
并且包含.h文件
1、def声明
要注意def内的LIBRARY后的名字。并且要把.h中可能存在的extern "C"去掉。
主程序:
#include
#include
#include
#include "main.h"
using namespace std;
#pragma comment(lib,"DllDef.lib")
//extern "C" _declspec(dllimport) int add(int, int);
int main()
{
cout << add(1, 2);
return 0;
}
main.h:
#pragma once
int _stdcall add(int a, int b);
int __stdcall sub(int a, int b);
2、在函数声明中加上__declspec(dllexport)
主程序:
#include
#include
#include
#include "main2.h"
using namespace std;
#pragma comment(lib,"Dllexport.lib")
//extern "C" _declspec(dllimport) int add(int, int);
int main()
{
cout << add(1, 2);
return 0;
}
main2.h:
#pragma once
extern "C" __declspec(dllexport) int add(int a, int b);
extern "C" __declspec(dllexport) int sub(int a, int b);