生成DLL
关于前面的怎么建立一个dll,请参考这篇博客。
https://blog.csdn.net/Giser_D/article/details/89677441
写的挺详细的。
我把pch.h文件贴在这里,里面做了详细的注释
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H //ifndef的意思是如果PCH_H未定义,则执行else前面的。
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#include<stdlib.h>
#endif //PCH_H
#pragma warning(disable:4996)
#ifdef IMPORT_DLL //ifdef的意思是如果IMPORT_DLL已经定义过了,则执行else前面的,如果未定义,则执行else后面的。
#else
#define IMPORT_DLL extern "C" _declspec(dllexport) //指的是允许将其给外部调用
//这里 _declspec是关键字,
#endif
//创建链接
IMPORT_DLL void init_mysocketImpl(void** handle);
//发送数据
IMPORT_DLL void sendData_mysocketImpl(void* handle, const char* sendData, int sendLen);
//接收数据
IMPORT_DLL void recevData_mysocketImpl(void* handle, char* recevData, int* recevLen);
//关闭
IMPORT_DLL void close_mysocketImpl(void* handle);
然后在pch.cpp文件里面具体实现这四个函数。接着生成解决方案,然后在debug文件里面找打.dll文件,复制。
链接DLL
这里是调用DLL的文件。
#include <stdio.h>
#include <string.h>
#include "windows.h"
int main()
{
HINSTANCE hDllInst;
hDllInst = LoadLibrary(L"myDll.dll"); //调用DLL
//初始化链接
typedef void(*init_mysocket)(void** handle); //这里是定义一个函数指针类型 以后init_mysocket就代表void init_mysocketImpl(void** handle);
//发送数据
typedef void(*sendData_mysocket)(void* handle, const char* sendData, int sendLen);
//接收数据
typedef void(*recevData_mysocket)(void* handle, char* recevData, int* recevLen);
//关闭
typedef void(*close_mysocket)(void* handle);
//这一段是重定义,下面使用方便点。
init_mysocket init; //这里的意思是 init变量为函数类型
sendData_mysocket send;
recevData_mysocket recev;
close_mysocket close;
//获得链接
init = (init_mysocket)GetProcAddress(hDllInst, "init_mysocketImpl");
void* conn = NULL;
init(&conn);
//发送数据
char buf[] = { "hello,world!....." };
int len = strlen(buf);
send = (sendData_mysocket)GetProcAddress(hDllInst, "sendData_mysocketImpl"); //GetProcAddress为获取该函数的地址
send(conn, buf, len);
//接收数据
char recevBuf[1024] = { 0 };
int recevLen = 0;
recev = (recevData_mysocket)GetProcAddress(hDllInst, "recevData_mysocketImpl"); //GetProcAddress为获取该函数的地址
recev(conn, recevBuf, &recevLen);
printf("接收到的数据是:%s\n", recevBuf);
printf("接收到的数据长度是:%d\n", recevLen);
//关闭
close = (close_mysocket)GetProcAddress(hDllInst, "close_mysocketImpl");
close(conn);
return 0;
}
在这里,先把代码写好,然后生成解决方案,之后把.dll文件复制到它的debug文件下就可以了,输出正确。我把项目文件夹附在后面。