Написать DLL-код
Новое строительство
Новый пустой проект проекта
Нажмите «ОК». Затем щелкните проект правой кнопкой мыши и выберите «Новый элемент».
Появится следующее изображение, выберите файл заголовка.
Выберите Новый элемент еще раз, выберите файл C++, измените его на MySocketClient.c и нажмите кнопку Добавить.
На данный момент новое строительство завершено.
Затем щелкните проект правой кнопкой мыши, выберите «Свойства», измените тип конфигурации на динамическую библиотеку (.dll).
Напишите заголовочный файл MySocketClient.h
#ifndef _INC_MYSOCKETCLIENT_H_
#define _INC_MYSOCKETCLIENT_H_
#define Import_SSS
#ifdef Import_SSS
#define API _declspec(dllexport)
#else
#define API _declspec(dllimport)
#endif
#ifdef _cplusplus//extern "C", чтобы сообщить компилятору: это файл библиотеки, написанный на C, пожалуйста, используйте C, чтобы связать их.
extern "C" {
#endif // _cplusplus
API//функция экспорта, пусть звонит внешний мир.
int socketClient_Init(void **handle);
API
int socketClient_Send(void *handle, unsigned char *buf, int buflen);
API
int socketClient_Recv(void *handle, unsigned char *buf, int *buflen);
API
int socketClient_Destory(void *handle);
#ifdef _cplusplus
}
#endif // _cplusplus
#endif //_INC_MYSOCKETCLIENT_H_
Напишите MySocketClient.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "MySocketClient.h"
typedef struct _Sck_Handle
{
char version[16];
char ip[16];
int port;
unsigned char *p;
int len;
}Sck_Handle;//Определяем структуру Handle.
int socketClient_Init(void **handle)
{
int ret = 0;
Sck_Handle *tmpHandle = NULL;
if (handle == NULL)
{
ret = -1;
printf("[socketClient_Init] err %d handle=NULL \n", ret);
return ret;
}
tmpHandle = (Sck_Handle *)malloc(sizeof(Sck_Handle));
if (tmpHandle == NULL)
{
ret = -2;
printf("[socketClient_Init] err:%d malloc err \n", ret);
}
memset(tmpHandle, 0, sizeof(Sck_Handle));//Инициализируем структуру.
strcpy(tmpHandle->version, "1.0.0.1");
strcpy(tmpHandle->ip, "192.168.12.121");
tmpHandle->port = 11111;
*handle = tmpHandle;
return ret;
}
отправка сообщения через сокет
//__declspec(dllexport)
int socketClient_Send(void *handle, unsigned char *buf, int buflen)
{
int ret = 0;
Sck_Handle *tmpHandle = NULL;
if (handle == NULL || buf == NULL || buflen <= 0)
{
ret = -2;
printf("func socketclient_send() err :%d (handle == NULL || buf==NULL || buflen <=0 ) \n", ret);
return ret;
}
tmpHandle = (Sck_Handle *)handle;
tmpHandle->len = buflen;
tmpHandle->p = (unsigned char *)malloc(buflen);
if (tmpHandle->p == NULL)
{
ret = -2;
printf("func socketclient_send() err :%d malloc len:%d \n", ret, buflen);
return ret;
}
memcpy(tmpHandle->p, buf, buflen); //Кэш данных в память
printf("Получены данные отправки: %s\n", tmpHandle->p);
return ret;
}
прием сообщений сокета
//__declspec(dllexport)
int socketClient_Recv(void *handle, unsigned char *buf, int *buflen)
{
int ret = 0;
Sck_Handle *tmpHandle = NULL;
if (handle == NULL || buf == NULL || buflen == NULL)
{
ret = -2;
printf("func socketclient_recv() err :%d (handle == NULL || buf==NULL || buflen==NULL ) \n", ret);
return ret;
}
tmpHandle = (Sck_Handle *)handle;
memcpy(buf, tmpHandle->p, tmpHandle->len);
*buflen = tmpHandle->len; // Косвенное присваивание сообщает вызывающей стороне длину полученных данных
printf("Длина данных %d\n", tmpHandle->len);
return ret;
}
выпуск среды сокета
//__declspec(dllexport)
int socketClient_Destory(void *handle)
{
int ret = 0;
Sck_Handle *tmpHandle = NULL;
if (handle == NULL)
{
return -1;
}
tmpHandle = (Sck_Handle *)handle;
if (tmpHandle->p != NULL)
{
free(tmpHandle->p); //Освобождаем область памяти, на которую указывает указатель поля члена структуры
}
free(tmpHandle); // Освобождаем память структуры
return 0;
}
Затем щелкните правой кнопкой мыши, чтобы скомпилировать проект. Вы можете увидеть сгенерированную dll в папке Debug.
динамический вызов
динамический вызов, использованиеLoadLibrary метод загрузки dll.
Создайте новое консольное приложение C++.
После завершения нового создания поместите скомпилированный файл dll, файл lib и файл h в проект.
Щелкните правой кнопкой мыши свойства проекта и измените набор символов, чтобы использовать многобайтовый набор символов.
Ниже приведен код, который вызывает dll.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
// определяем функцию указателя
typedef int(*SOCLETCLIENT_INIT)(void **handle);
typedef int(*SOCKETCLIENT_SEND)(void *handle, unsigned char *buf, int buflen);
typedef int(*SOCKETCLIENT_RECV)(void *handle, unsigned char *buf, int *buflen);
typedef int(*SOCKETCLIENT_DESTORY)(void *handle);
int main()
{
HINSTANCE hInstance;
hInstance = LoadLibrary("MySocketClient.dll");
SOCLETCLIENT_INIT socketClient_Init= (SOCLETCLIENT_INIT)GetProcAddress(hInstance, "socketClient_Init");
SOCKETCLIENT_SEND socketClient_Send=(SOCKETCLIENT_SEND)GetProcAddress(hInstance, "socketClient_Send");;
SOCKETCLIENT_RECV socketClient_Recv= (SOCKETCLIENT_RECV)GetProcAddress(hInstance, "socketClient_Recv");;
SOCKETCLIENT_DESTORY socketClient_Destory= (SOCKETCLIENT_DESTORY)GetProcAddress(hInstance, "socketClient_Destory");;
unsigned char buf[1024];
int buflen;
unsigned char out[1024];
int outlen;
void *handle = NULL;
int ret = 0;
strcpy((char *)buf, "aaaaAAAAAFFffffffdddddddd");
buflen = 9;
// Инициализация клиента получает дескриптор вверх и вниз
ret = socketClient_Init(&handle /*out*/);
if (ret != 0)
{
printf("func socketclient_init() err:%d \n ", ret);
goto End;
}
//Клиент отправляет сообщение
ret = socketClient_Send(handle /*in*/, buf /*in*/, buflen /*in*/);
if (ret != 0)
{
printf("func socketclient_send() err:%d \n ", ret);
goto End;
}
//Клиент получает сообщение
ret = socketClient_Recv(handle /*in*/, out /*in*/, &outlen/*in out*/);
if (ret != 0)
{
printf("func socketclient_recv() err:%d \n ", ret);
goto End;
}
printf("Длина полученных данных %d\n",outlen);
End:
//Клиент освобождает ресурсы
ret = socketClient_Destory(handle/*in*/);
if (hInstance != NULL)
{
FreeLibrary(hInstance);
hInstance = NULL;
}
printf("hello...\n");
system("pause");
return 0;
}
использовать
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"MySocketClient.lib")
extern "C"
{
int socketClient_Init(void **handle);
int socketClient_Send(void *handle, unsigned char *buf, int buflen);
int socketClient_Recv(void *handle, unsigned char *buf, int *buflen);
int socketClient_Destory(void *handle);
}
int main()
{
unsigned char buf[1024];
int buflen;
unsigned char out[1024];
int outlen;
void *handle = NULL;
int ret = 0;
strcpy((char *)buf, "aaaaAAAAAFFffffffdddddddd");
buflen = 9;
// Инициализация клиента получает дескриптор вверх и вниз
ret = socketClient_Init(&handle /*out*/);
if (ret != 0)
{
printf("func socketclient_init() err:%d \n ", ret);
goto End;
}
//Клиент отправляет сообщение
ret = socketClient_Send(handle /*in*/, buf /*in*/, buflen /*in*/);
if (ret != 0)
{
printf("func socketclient_send() err:%d \n ", ret);
goto End;
}
//Клиент получает сообщение
ret = socketClient_Recv(handle /*in*/, out /*in*/, &outlen/*in out*/);
if (ret != 0)
{
printf("func socketclient_recv() err:%d \n ", ret);
goto End;
}
printf("Длина полученных данных %d \n", outlen);
End:
//Клиент освобождает ресурсы
ret = socketClient_Destory(handle/*in*/);
printf("hello...\n");
system("pause");
return 0;
}
статический вызов
Статический вызов, используйте вызов файла lib
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"MySocketClient.lib")
extern "C"
{
int socketClient_Init(void **handle);
int socketClient_Send(void *handle, unsigned char *buf, int buflen);
int socketClient_Recv(void *handle, unsigned char *buf, int *buflen);
int socketClient_Destory(void *handle);
}
int main()
{
unsigned char buf[1024];
int buflen;
unsigned char out[1024];
int outlen;
void *handle = NULL;
int ret = 0;
strcpy((char *)buf, "aaaaAAAAAFFffffffdddddddd");
buflen = 9;
// Инициализация клиента получает дескриптор вверх и вниз
ret = socketClient_Init(&handle /*out*/);
if (ret != 0)
{
printf("func socketclient_init() err:%d \n ", ret);
goto End;
}
//Клиент отправляет сообщение
ret = socketClient_Send(handle /*in*/, buf /*in*/, buflen /*in*/);
if (ret != 0)
{
printf("func socketclient_send() err:%d \n ", ret);
goto End;
}
//Клиент получает сообщение
ret = socketClient_Recv(handle /*in*/, out /*in*/, &outlen/*in out*/);
if (ret != 0)
{
printf("func socketclient_recv() err:%d \n ", ret);
goto End;
}
printf("Длина полученных данных %d \n", outlen);
End:
//Клиент освобождает ресурсы
ret = socketClient_Destory(handle/*in*/);
printf("hello...\n");
system("pause");
return 0;
}
результат операции: