0 前言
在两种情况下生成dll和lib(1.直接给c++用; 2.给java或者c#用),其中,前者最简单,后者需要在dllmain()中生成。
版本一
在C++下的生成
假设有以下代码,现在想生成action()函数:
#include XX
using namespace XX;
void action(int a, int b)
{ XXX;}
int main()
{action(X,Y);
return 0;}
新建一个dll项目-win32项目(不建议选择win32控制台应用程序)-(如果只想得到lib,则在建立项目的时候选择静态库,选择dll),然后将这个代码写进去,变成了这样:
#include XX
using namespace XX;
extern "C" __declspec(dllexport) void action(int a, int b);
void action(int a, int b)
{
XXX;
}
可以在属性-常规-配置类型 中选择生成的类型,build就可以生成dll和lib。
在C++下的调用
调用lib的时候仍然需要dll,老实放在项目根目录之下吧。
#include XX
using namespace XX;
#pragma comment(lib,"action.lib")
extern "C"_declspec(dllimport) void action(int a, int b);//别用dllexport
int main()
{
action(X,Y);
return 0;
}
调用dll就比较麻烦,但对我来说不是事:
#include <windows.h>
#include <stdio.h>
#include<iostream>
using namespace std;
typedef int(*ApiAdd)(int a, int b);
int main()
{
//Load DLL
HINSTANCE hInstance = LoadLibrary(TEXT("api_add.dll"));
if (hInstance == NULL)
{
printf("Error: unable to load DLL\n");
return 1;
}
//Get function address
ApiAdd apiadd = (ApiAdd)::GetProcAddress(hInstance, "FaceAngle");
if (apiadd == NULL)
{
printf("Error: unable to find DLL function\n");
FreeLibrary(hInstance);
return 1;
}
//Call function
int ret = apiadd(1, 3);
//Unload DLL file
FreeLibrary(hInstance);
return 0;
}
版本二
在java和c#下的生成
新建项目-win32项目(别选win32控制台)-dll+预编译头(其他的就不要了) 完成后会自动生成好几个文件,还有一个dllmain。
在xxdll.cpp里添加想要生成的函数,并创建对应的头文件。
#include <vector>
#include <windows.h>
using namespace std;
//当调用不成功的时候请使用EXTERN_C
extern "C" _declspec(dllexport) int Add_func(int a, int b);
然后在 属性-c/c++-高级-编译为-编译为 C++ 代码 (/TP) build就OK了!
如果你只想运行exe却不出现cmd窗口咋办?在main里输入这个:
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);