Dev c++ C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客
在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客
两步之后,尝试加入结构体实现整体数据使用。
注意结构体 Ak
是相同的
代码如下
DLL文件有两个,dll.dll是上面提到的链接里的
dllv2.dll是这个代码里的
dllv2.cpp
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <iostream>using namespace std;void mainDll(){ak.count++;ak.number=1; ak.x=0;ak.y=0;cout<<"atking"<<endl;for(int i=0;i<10;i++){ak.x++;}cout<<"count: "<<ak.count<<endl;
}
// dll.h
#ifndef _DLL_H_
#define _DLL_H_typedef struct Ak{int x; // 位置坐标 int y;int number; // 类型 int time; // 时长上限 int count; // 计时
}; Ak ak;extern "C"
{void mainDll();
}#endif
主程序代码如下
#include <windows.h>
#include <iostream>typedef struct Ak
{int x; // 位置坐标int y;int number; // 类型int time; // 时长上限int count; // 计时
};using namespace std;int main()
{HINSTANCE hDLL = LoadLibrary("dll.dll"); // 填文件名HINSTANCE hDLLv2 = LoadLibrary("dllv2.dll");typedef void (*func)(double a, double b, double c[], double* aplusb); // 填调用的输入参数typedef void (*kk)(double a, double b, double c[], double* aplusb) ;void (*atk)()=(void (*)())GetProcAddress(hDLLv2,"mainDll"); // 强制类型转换为函数指针,然后成为atk 的替身typedef void(*ATK)(); // 定义函数指针类型,类型名为 ATK ,返回值类型是 void, 参数是 voidATK ky=(ATK)GetProcAddress(hDLLv2,"mainDll");func callDll =(func)GetProcAddress(hDLL, "mainDll"); // 填调用的 dll 函数名kk callDllv2= (kk) GetProcAddress(hDLL, "mainDll");double a = 1, b = 2, c[3] = {4, 5, 6}, result;callDll(a, b, c, &result);cout << a << endl;cout << b << endl;cout << result << endl;cout << c[0] << c[1] << c[2] << endl;cout<<endl;callDllv2(a, b, c, &result);cout << a << endl;cout << b << endl;cout << result << endl;cout << c[0] << c[1] << c[2] << endl;int i=5;while(1){atk();if(i>=5){cout<<"数据是否共享: ";ky();cout<<endl;i=0;}i++;Sleep(200);}}