首先建立“dll.h”,注意其中函数导出方式
文件内容:
#define EXPORT extern "C" _declspec(dllexport) __stdcall
extern "C" _declspec(dllexport) void __stdcall SetString(char*);
extern "C" _declspec(dllexport) void GetString(char*);
extern "C" _declspec(dllexport) void __stdcall SetData(int);
extern "C" _declspec(dllexport) int dllGlobalVar;
建立“dll.cpp”,注意其中函数定义方式
文件内容:
#include <windows.h>
#include <iostream>
using namespace std;
#include "dll.h"
#pragma data_seg("shared")
char buffer[30] = "hello";
int dllGlobalVar = 1;
#pragma data_seg()
#pragma comment(linker, "/SECTION:shared,RWS")
void __stdcall SetString(char* str) {
strcpy(buffer, str);
}
void GetString(char* str){
strcpy(str, buffer);
cout << "hellpo" << endl;
}
void __stdcall SetData(int i)
{
dllGlobalVar = i;
}
然后在另一个工程中调用它,把前两步生成的DLL文件拷贝到工程目录下,通过depends工具可以查看DLL中的函数名称
调用方式:
#include "windows.h"
#include <iostream>
#include <string>
using namespace std;
#include "dll.h"
typedef void (__stdcall* p_setStringFunc)(char *);
typedef void (* p_getStringFunc)(char *);
typedef void (__stdcall* p_setData)(int);
int _tmain(int argc, _TCHAR* argv[])
{
int *GlobalVar;
HINSTANCE hDLL;
char temp[40];
hDLL = LoadLibrary("dll_simple_exa.dll");
if (hDLL != NULL)
{
cout << "get DLL success!" << endl;
}
p_getStringFunc p_get;
p_setData p_set;
p_setStringFunc p_set_str;
p_get = (p_getStringFunc)GetProcAddress(hDLL, "GetString");
p_set = (p_setData)GetProcAddress(hDLL, "_SetData@4");
p_set_str = (p_setStringFunc)GetProcAddress(hDLL, "_SetString@4");
GlobalVar = (int *)GetProcAddress(hDLL, "dllGlobalVar");
p_set(4);
printf("dll data: %d/n", *GlobalVar);
p_get(temp);
string str_temp = temp;
cout << "str_temp: " << str_temp << endl;
p_set_str("fuok");
p_get(temp);
str_temp = temp;
cout << "str_temp: " << str_temp << endl;
FreeLibrary(hDLL);
system("pause");
return 0;
}
哈哈,一个下午的艰辛劳动成果呀