С++ статически вызывает библиотеку DLL C (вызывает файл lib)

искусственный интеллект

Написать 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.

 

статический вызов

Статический вызов, используйте вызов файла 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;

}

результат операции: