本文主要总结将类生成dll并且调用中遇到的坑和操作。平时打包成一个类的好处在于内部可以有多个成员函数供以调用,且成员变量也可以共用。如果平时想用到多个函数打包成的dll,那一个个封装会很繁琐,且多个函数间可能会用到共用的变量,**分开封装,相应变量将得不到及时的更新。因为每次主线程进入dll的时候,相应变量是不共享内存的,dll中操作的是变量的拷贝版,而不是变量本身。**所以今后尽量将多个函数统一成一个类内的成员函数最好,坑也相对来说最少。

类的封装

类的封装,在VS中生成:
1…h文件声明类及内部成员
2…cpp文件定义函数及变量

.h文件包含内容

#pragma once
#ifndef __COMANGLE_H__
#define __COMANGLE_H__#include "windows.h"
#include <stdio.h>
#include <tchar.h>//#ifdef _WIN32
//#ifdef CCA_API         //这个在哪里定义了?
#define CCA_API __declspec(dllexport)
//#else
//#define CCA_API __declspec(dllimport)
//#endif
//#else
//#define CCA_API __attribute__ ((visibility("default")))
//#endif#ifndef JY901_h
#define JY901_h#define SAVE             0x00
#define CALSW       0x01
#define RSW             0x02
#define RRATE           0x03
#define BAUD            0x04
#define AXOFFSET    0x05
#define AYOFFSET    0x06
#define AZOFFSET    0x07
#define GXOFFSET    0x08
#define GYOFFSET    0x09
#define GZOFFSET    0x0a
#define HXOFFSET    0x0b
#define HYOFFSET    0x0c
#define HZOFFSET    0x0d
#define D0MODE      0x0e
#define D1MODE      0x0f
#define D2MODE      0x10
#define D3MODE      0x11
#define D0PWMH      0x12
#define D1PWMH      0x13
#define D2PWMH      0x14
#define D3PWMH      0x15
#define D0PWMT      0x16
#define D1PWMT      0x17
#define D2PWMT      0x18
#define D3PWMT      0x19
#define IICADDR     0x1a
#define LEDOFF      0x1b
#define GPSBAUD     0x1c#define YYMM                0x30
#define DDHH                0x31
#define MMSS                0x32
#define MS                  0x33
#define AX                  0x34
#define AY                  0x35
#define AZ                  0x36
#define GX                  0x37
#define GY                  0x38
#define GZ                  0x39
#define HX                  0x3a
#define HY                  0x3b
#define HZ                  0x3c
#define Roll                0x3d
#define Pitch               0x3e
#define Yaw                 0x3f
#define TEMP                0x40
#define D0Status        0x41
#define D1Status        0x42
#define D2Status        0x43
#define D3Status        0x44
#define PressureL       0x45
#define PressureH       0x46
#define HeightL         0x47
#define HeightH         0x48
#define LonL                0x49
#define LonH                0x4a
#define LatL                0x4b
#define LatH                0x4c
#define GPSHeight   0x4d
#define GPSYAW      0x4e
#define GPSVL               0x4f
#define GPSVH               0x50#define DIO_MODE_AIN 0
#define DIO_MODE_DIN 1
#define DIO_MODE_DOH 2
#define DIO_MODE_DOL 3
#define DIO_MODE_DOPWM 4
#define DIO_MODE_GPS 5      #define     TOTAL_PORT_NUM      65
#define     START_PORT_NUM      0#define        iBufferSize 250
#define     UARTBufferLength 2000
#undef  SYNCHRONOUS_MODEstruct STime
{unsigned char ucYear;unsigned char ucMonth;unsigned char ucDay;unsigned char ucHour;unsigned char ucMinute;unsigned char ucSecond;unsigned short usMiliSecond;
};
struct SAcc
{short a[3];short T;
};
struct SGyro
{short w[3];short T;
};
struct SAngle
{short Angle[3];short T;
};
struct SMag
{short h[3];short T;
};
struct SDStatus
{short sDStatus[4];
};
struct SPress
{long lPressure;long lAltitude;
};
struct SLonLat
{long lLon;long lLat;
};
struct SGPSV
{short sGPSHeight;short sGPSYaw;long lGPSVelocity;
};
class CCA_API CCA
{
public:struct STime     stcTime;struct SAcc         stcAcc;struct SGyro         stcGyro;struct SAngle       stcAngle;struct SMag        stcMag;struct SDStatus  stcDStatus;struct SPress        stcPress;struct SLonLat         stcLonLat;struct SGPSV      stcGPSV;//static成员变量须在类外定义static HANDLE      hComDev[TOTAL_PORT_NUM];static unsigned long long ulComMask;static HANDLE       hCOMThread[TOTAL_PORT_NUM];static OVERLAPPED    stcWriteStatus[TOTAL_PORT_NUM];static OVERLAPPED    stcReadStatus[TOTAL_PORT_NUM];static volatile char chrUARTBuffers[TOTAL_PORT_NUM][UARTBufferLength];static volatile unsigned long ulUARTBufferStart[TOTAL_PORT_NUM];static volatile unsigned long ulUARTBufferEnd[UARTBufferLength];static char chrUARTBufferOutput[1000];CCA();void CopeSerialData(unsigned short usLength);signed char   SendUARTMessageLength(const unsigned long ulChannelNo, const char chrMessage[], const unsigned short usLen);unsigned short CollectUARTData(const unsigned long ulChannelNo);signed char SetBaundrate(const unsigned long ulPortNo, const unsigned long ulBaundrate);signed char OpenCOMDevice(const unsigned long ulPortNo, const unsigned long ulBaundrate);void CloseCOMDevice(void);//由于后续要进行类型转换,又是类内成员函数,所以要static修饰static DWORD WINAPI ReceiveCOMData(PVOID pParam);~CCA();
};
extern CCA ComAngle;
#endif#endif

.cpp文件包含

#include "ComAngle.h"
#include "string.h"CCA::CCA()
{
}CCA::~CCA()
{
}HANDLE CCA::hComDev[TOTAL_PORT_NUM] = { NULL };  //初始化时不需要加static
unsigned long long CCA::ulComMask = 0;
HANDLE  CCA::hCOMThread[TOTAL_PORT_NUM] = { NULL };
OVERLAPPED   CCA::stcWriteStatus[TOTAL_PORT_NUM] = { 0 };
OVERLAPPED   CCA::stcReadStatus[TOTAL_PORT_NUM] = { 0 };
volatile char CCA::chrUARTBuffers[TOTAL_PORT_NUM][UARTBufferLength] = { 0 };
volatile unsigned long CCA::ulUARTBufferStart[TOTAL_PORT_NUM] = { 0 };
volatile unsigned long CCA::ulUARTBufferEnd[UARTBufferLength] = { 0 };char CCA::chrUARTBufferOutput[1000] = { 0 };
CCA ComAngle = CCA();void CCA::CopeSerialData(unsigned short usLength)
{static unsigned char chrTemp[2000];static unsigned char ucRxCnt = 0;static unsigned short usRxLength = 0;memcpy(chrTemp, chrUARTBufferOutput, usLength);usRxLength += usLength;while (usRxLength >= 11){if (chrTemp[0] != 0x55){usRxLength--;memcpy(&chrTemp[0], &chrTemp[1], usRxLength);continue;}switch (chrTemp[1]){case 0x50:    memcpy(&stcTime, &chrTemp[2], 8); break;case 0x51:  memcpy(&stcAcc, &chrTemp[2], 8); break;case 0x52:   memcpy(&stcGyro, &chrTemp[2], 8); break;case 0x53:  memcpy(&stcAngle, &chrTemp[2], 8); break;case 0x54: memcpy(&stcMag, &chrTemp[2], 8); break;case 0x55:   memcpy(&stcDStatus, &chrTemp[2], 8); break;case 0x56:   memcpy(&stcPress, &chrTemp[2], 8); break;case 0x57: memcpy(&stcLonLat, &chrTemp[2], 8); break;case 0x58:    memcpy(&stcGPSV, &chrTemp[2], 8); break;}usRxLength -= 11;memcpy(&chrTemp[0], &chrTemp[11], usRxLength);}
}signed char CCA::SendUARTMessageLength(const unsigned long ulChannelNo, const char chrSendBuffer[], const unsigned short usLen)
{DWORD iR;DWORD dwRes;DCB dcb;char chrDataToSend[1000] = { 0 };memcpy(chrDataToSend, chrSendBuffer, usLen);memcpy(&chrDataToSend[usLen], chrSendBuffer, usLen);GetCommState(hComDev[ulChannelNo], &dcb);dcb.fDtrControl = 0;//DTR = 1;发送SetCommState(hComDev[ulChannelNo], &dcb);if (WriteFile(hComDev[ulChannelNo], chrSendBuffer, usLen, &iR, &(stcWriteStatus[ulChannelNo])) || GetLastError() != ERROR_IO_PENDING)return -1;dwRes = WaitForSingleObject(stcWriteStatus[ulChannelNo].hEvent, 1000);Sleep(10);dcb.fDtrControl = 1;//DTR = 0;接收SetCommState(hComDev[ulChannelNo], &dcb);Sleep(10);if (dwRes != WAIT_OBJECT_0 || !GetOverlappedResult(hComDev[ulChannelNo], &stcWriteStatus[ulChannelNo], &iR, FALSE))return 0;return 0;
}unsigned short CCA::CollectUARTData(const unsigned long ulCOMNo)
{unsigned long ulLength = 0;unsigned long ulEnd;unsigned long ulStart;#ifdef SYNCHRONOUS_MODEWaitForSingleObject(hReceiveEvent[ulIndexCorrect], INFINITE);ResetEvent(hReceiveEvent[ulIndexCorrect]);
#endifulEnd = ulUARTBufferEnd[ulCOMNo];ulStart = ulUARTBufferStart[ulCOMNo];if (ulEnd == ulStart)return(0);if (ulEnd > ulStart){memcpy((void*)chrUARTBufferOutput, (void*)(chrUARTBuffers[ulCOMNo] + ulStart), ulEnd - ulStart);ulLength = ulEnd - ulStart;}else{memcpy((void*)chrUARTBufferOutput, (void*)(chrUARTBuffers[ulCOMNo] + ulStart), UARTBufferLength - ulStart);if (ulEnd != 0){memcpy((void*)(chrUARTBufferOutput + (UARTBufferLength - ulStart)), (void*)chrUARTBuffers[ulCOMNo], ulEnd);}ulLength = UARTBufferLength + ulEnd - ulStart;}ulUARTBufferStart[ulCOMNo] = ulEnd;return (unsigned short)ulLength;
}signed char CCA::SetBaundrate(const unsigned long ulPortNo, const unsigned long ulBaundrate)
{DCB dcb;GetCommState(hComDev[ulPortNo], &dcb);dcb.BaudRate = ulBaundrate;SetCommState(hComDev[ulPortNo], &dcb);return 0;
}//静态成员函数实现定义也不需要加static,并且内部可以调用static变量,
//但一般成员变量,static成员函数不可直接调用
DWORD WINAPI CCA::ReceiveCOMData(PVOID pParam)
{unsigned long uLen;unsigned long ulLen1;unsigned long ulLen2;DWORD dwRes;COMSTAT Comstat;DWORD dwErrorFlags;char chrBuffer[iBufferSize] = { 0 };unsigned long ulUARTBufferEndTemp = ulUARTBufferEnd[0];unsigned long ulComNumber = 0;memcpy(&ulComNumber, pParam, 4);while (1){if (!ReadFile(hComDev[ulComNumber], chrBuffer, iBufferSize - 1, &uLen, &(stcReadStatus[ulComNumber]))){dwRes = GetLastError();if (dwRes != ERROR_IO_PENDING){ClearCommError(hComDev[ulComNumber], &dwErrorFlags, &Comstat);continue;}WaitForSingleObject(stcReadStatus[ulComNumber].hEvent, INFINITE);if (!GetOverlappedResult(hComDev[ulComNumber], &(stcReadStatus[ulComNumber]), &uLen, FALSE))continue;if (uLen <= 0)continue;if ((ulUARTBufferEndTemp + uLen) > UARTBufferLength){ulLen1 = UARTBufferLength - ulUARTBufferEndTemp;ulLen2 = uLen - ulLen1;if (ulLen1 > 0){memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]], (void *)chrBuffer, ulLen1);}if (ulLen2 > 0){memcpy((void *)&chrUARTBuffers[ulComNumber][0], (void *)(chrBuffer + ulLen1), ulLen2);}ulUARTBufferEndTemp = ulLen2;}else{memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]], (void *)chrBuffer, uLen);ulUARTBufferEndTemp += uLen;}if (ulUARTBufferEndTemp == ulUARTBufferStart[ulComNumber]){printf("Error!");}else{ulUARTBufferEnd[ulComNumber] = ulUARTBufferEndTemp;}#ifdef SYNCHRONOUS_MODESetEvent(hReceiveEvent[ucComNumber]);
#endifcontinue;}if (uLen <= 0)continue;if ((ulUARTBufferEndTemp + uLen) > (UARTBufferLength)){ulLen1 = UARTBufferLength - ulUARTBufferEndTemp;ulLen2 = uLen - ulLen1;if (ulLen1 > 0){memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]], (void *)chrBuffer, ulLen1);}if (ulLen2 > 0){memcpy((void *)&chrUARTBuffers[ulComNumber][0], (void *)(chrBuffer + ulLen1), ulLen2);}ulUARTBufferEndTemp = ulLen2;}else{memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]], (void *)chrBuffer, uLen);ulUARTBufferEndTemp += uLen;}if (ulUARTBufferEndTemp == ulUARTBufferStart[ulComNumber]){printf("Error!");}else{ulUARTBufferEnd[ulComNumber] = ulUARTBufferEndTemp;}#ifdef SYNCHRONOUS_MODESetEvent(hReceiveEvent[ucComNumber]);
#endif}return 0;
}signed char CCA::OpenCOMDevice(const unsigned long ulPortNo, const unsigned long ulBaundrate)
{DWORD dwThreadID, dwThreadParam;COMSTAT Comstat;DWORD dwErrorFlags;DWORD dwRes;DCB dcb;COMMTIMEOUTS comTimeOut;TCHAR PortName[10] = { '\\','\\','.','\\','C','O','M',0,0,0 };//"\\\\.\\COM";TCHAR chrTemple[5] = { 0 };if (ulPortNo >= TOTAL_PORT_NUM){printf("\nerror: exceed the max com port num\n");return -1;}_itot(ulPortNo + START_PORT_NUM, chrTemple, 10);_tcscat(PortName, chrTemple);if ((hComDev[ulPortNo] = CreateFile(PortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL)) == INVALID_HANDLE_VALUE){dwRes = GetLastError();return -1;}ulComMask |= 1 << ulPortNo;SetupComm(hComDev[ulPortNo], iBufferSize, iBufferSize);GetCommState(hComDev[ulPortNo], &dcb);dcb.BaudRate = ulBaundrate;dcb.fParity = NOPARITY;dcb.ByteSize = 8;dcb.fDtrControl = 1;//DTR = 0;接收dcb.fRtsControl = 0;//RTS = 0;接收dcb.StopBits = ONESTOPBIT;SetCommState(hComDev[ulPortNo], &dcb);ClearCommError(hComDev[ulPortNo], &dwErrorFlags, &Comstat);dwRes = GetLastError();comTimeOut.ReadIntervalTimeout = 5;comTimeOut.ReadTotalTimeoutMultiplier = 10;comTimeOut.ReadTotalTimeoutConstant = 100;comTimeOut.WriteTotalTimeoutMultiplier = 5;comTimeOut.WriteTotalTimeoutConstant = 5;SetCommTimeouts(hComDev[ulPortNo], &comTimeOut);stcWriteStatus[ulPortNo].hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);stcReadStatus[ulPortNo].hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);stcReadStatus[ulPortNo].Internal = 0;stcReadStatus[ulPortNo].InternalHigh = 0;stcReadStatus[ulPortNo].Offset = 0;stcReadStatus[ulPortNo].OffsetHigh = 0;dwThreadParam = ulPortNo;hCOMThread[dwThreadParam] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReceiveCOMData, &dwThreadParam, 0, &dwThreadID);SetThreadPriority(hCOMThread[ulPortNo], THREAD_PRIORITY_NORMAL);Sleep(200);return 0;
}void CCA::CloseCOMDevice()
{unsigned char i;for (i = 0; i < sizeof(ulComMask) * 8; i++){if ((ulComMask & (1 << i)) == 0)continue;ulUARTBufferEnd[i] = 0; ulUARTBufferStart[i] = 0;TerminateThread(hCOMThread[i], 0);WaitForSingleObject(hCOMThread[i], 10000);PurgeComm(hComDev[i], PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);CloseHandle(stcReadStatus[i].hEvent);CloseHandle(stcWriteStatus[i].hEvent);CloseHandle(hComDev[i]);}ulComMask = 0;
}

.cpp文件中甚至不需要有export字眼的出现
注意:在项目属性中,需要把生成改成.dll。

dll的调用

对类封装好后的dll调用包括两部分:
1.相关文件的放置
2.代码书写

1.相关文件放置

将编译好的dll放入sln存在的x64文件夹中
将lib放入源代码所在的lib文件夹中(没有就自己新建一个)
.h文件放在源代码所在的include文件夹中(没有新建)

2.调用代码

.h文件如下

#pragma once
#ifndef __COMANGLE_H__
#define __COMANGLE_H__#include "windows.h"
#include <stdio.h>
#include <tchar.h>//#ifdef _WIN32
//#ifdef CCA_API         //这个在哪里定义了?
#define CCA_API __declspec(dllexport)
//#else
//#define CCA_API __declspec(dllimport)
//#endif
//#else
//#define CCA_API __attribute__ ((visibility("default")))
//#endif#ifndef JY901_h
#define JY901_h#define SAVE             0x00
#define CALSW       0x01
#define RSW             0x02
#define RRATE           0x03
#define BAUD            0x04
#define AXOFFSET    0x05
#define AYOFFSET    0x06
#define AZOFFSET    0x07
#define GXOFFSET    0x08
#define GYOFFSET    0x09
#define GZOFFSET    0x0a
#define HXOFFSET    0x0b
#define HYOFFSET    0x0c
#define HZOFFSET    0x0d
#define D0MODE      0x0e
#define D1MODE      0x0f
#define D2MODE      0x10
#define D3MODE      0x11
#define D0PWMH      0x12
#define D1PWMH      0x13
#define D2PWMH      0x14
#define D3PWMH      0x15
#define D0PWMT      0x16
#define D1PWMT      0x17
#define D2PWMT      0x18
#define D3PWMT      0x19
#define IICADDR     0x1a
#define LEDOFF      0x1b
#define GPSBAUD     0x1c#define YYMM                0x30
#define DDHH                0x31
#define MMSS                0x32
#define MS                  0x33
#define AX                  0x34
#define AY                  0x35
#define AZ                  0x36
#define GX                  0x37
#define GY                  0x38
#define GZ                  0x39
#define HX                  0x3a
#define HY                  0x3b
#define HZ                  0x3c
#define Roll                0x3d
#define Pitch               0x3e
#define Yaw                 0x3f
#define TEMP                0x40
#define D0Status        0x41
#define D1Status        0x42
#define D2Status        0x43
#define D3Status        0x44
#define PressureL       0x45
#define PressureH       0x46
#define HeightL         0x47
#define HeightH         0x48
#define LonL                0x49
#define LonH                0x4a
#define LatL                0x4b
#define LatH                0x4c
#define GPSHeight   0x4d
#define GPSYAW      0x4e
#define GPSVL               0x4f
#define GPSVH               0x50#define DIO_MODE_AIN 0
#define DIO_MODE_DIN 1
#define DIO_MODE_DOH 2
#define DIO_MODE_DOL 3
#define DIO_MODE_DOPWM 4
#define DIO_MODE_GPS 5      #define     TOTAL_PORT_NUM      65
#define     START_PORT_NUM      0#define        iBufferSize 250
#define     UARTBufferLength 2000
#undef  SYNCHRONOUS_MODEstruct STime
{unsigned char ucYear;unsigned char ucMonth;unsigned char ucDay;unsigned char ucHour;unsigned char ucMinute;unsigned char ucSecond;unsigned short usMiliSecond;
};
struct SAcc
{short a[3];short T;
};
struct SGyro
{short w[3];short T;
};
struct SAngle
{short Angle[3];short T;
};
struct SMag
{short h[3];short T;
};
struct SDStatus
{short sDStatus[4];
};
struct SPress
{long lPressure;long lAltitude;
};
struct SLonLat
{long lLon;long lLat;
};
struct SGPSV
{short sGPSHeight;short sGPSYaw;long lGPSVelocity;
};
class CCA_API CCA
{
public:struct STime     stcTime;struct SAcc         stcAcc;struct SGyro         stcGyro;struct SAngle       stcAngle;struct SMag        stcMag;struct SDStatus  stcDStatus;struct SPress        stcPress;struct SLonLat         stcLonLat;struct SGPSV      stcGPSV;//static成员变量须在类外定义static HANDLE      hComDev[TOTAL_PORT_NUM];static unsigned long long ulComMask;static HANDLE       hCOMThread[TOTAL_PORT_NUM];static OVERLAPPED    stcWriteStatus[TOTAL_PORT_NUM];static OVERLAPPED    stcReadStatus[TOTAL_PORT_NUM];static volatile char chrUARTBuffers[TOTAL_PORT_NUM][UARTBufferLength];static volatile unsigned long ulUARTBufferStart[TOTAL_PORT_NUM];static volatile unsigned long ulUARTBufferEnd[UARTBufferLength];static char chrUARTBufferOutput[1000];CCA();/*{}*/void CopeSerialData(unsigned short usLength);signed char SendUARTMessageLength(const unsigned long ulChannelNo, const char chrMessage[], const unsigned short usLen);unsigned short CollectUARTData(const unsigned long ulChannelNo);signed char SetBaundrate(const unsigned long ulPortNo, const unsigned long ulBaundrate);signed char OpenCOMDevice(const unsigned long ulPortNo, const unsigned long ulBaundrate);void CloseCOMDevice(void);static DWORD WINAPI ReceiveCOMData(PVOID pParam);~CCA();/* {}*/
};
extern CCA ComAngle;
#endif#endif

.cpp文件夹

#include <iostream>
#include "time.h"
#include "windows.h"
#include ".\include\ComAngle.h"#pragma comment(lib,"./lib/AngleDetectionV4.lib")int main()
{CCA Ccom_angle;unsigned long ulBaund = 9600; unsigned long ulComNo = 4;char chrBuffer[2000];unsigned short usLength = 0, usCnt = 0;signed char cResult = 1;while (cResult != 0){cResult = Ccom_angle.OpenCOMDevice(ulComNo, ulBaund);}while (1){usLength = Ccom_angle.CollectUARTData(ulComNo);if (usLength > 0){//算法解析Ccom_angle.CopeSerialData(usLength);}Sleep(100);if (usCnt++ >= 0){usCnt = 0;float x = (float)Ccom_angle.stcAngle.Angle[0] / 32768 * 180;float y = (float)Ccom_angle.stcAngle.Angle[1] / 32768 * 180;float z = (float)Ccom_angle.stcAngle.Angle[2] / 32768 * 180;std::cout << x << "    " << y << "    " << z << "    " << std::endl;}}
}

以上就是整个类封装成dll并调用的全过程,中间编译的一些错误,需要对症下药。预处理器,包含文件,#ifdef等都需要知道是干嘛的。相关坑点也在代码中有注释。

C++动态库dll生成及调用总结相关推荐

  1. C++中.lib静态库、.dll动态库的生成及调用2

    关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...

  2. C++中.lib静态库、.dll动态库的生成及调用1

    一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...

  3. 【Linux】静态库与动态库的生成及调用

    一,库:一种可执行代码的二进制形式,可以被载入内存执行.其中库分为静态库.动态库 二,静态库和动态库的区别          1)Linux 下静态库:名字一般为 lib***.a利用静态函数库编译成 ...

  4. C#.net调用动态库dll注意事项

    C#.net调用动态库dll注意事项 本文主要描述作者在工作中所遇到技术难点及问题,最后提出相关的解决方案 场景 公司有个业务需求涉及到ID读卡器,构建成在ID卡读卡器一刷ID卡,系统就自动显示其ID ...

  5. Windows下动态链接库和静态链接库的生成以及调用

    Windows下静态库和动态库的生成和调用 一.简介 二.生成静态链接库(.lib)和动态链接库(.dll) 三.静态链接库的调用 四.动态链接库的调用 动态链接库的两种调用方式 仅使用.dll文件 ...

  6. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序

    引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...

  7. C#总结:C#调用C++的动态库Dll遇到的问题[动态库调用/结构体指针调用/union共同体定义]

    记录使用C#调用C++的生成的DLL手柄键盘驱动库包括****.sys(驱动文件)和****.dll(库文件)的全部问题. C#调用C++的库有两种:静态调用和动态调用 静态调用,使用.net 提供的 ...

  8. c++由动态库dll文件生成lib文件的方法

    很多动态库dll文件,并没有附带lib文件,因此就无法以静态加载的方式去使用.但是此问题也是有解决办法的,就是从dll文件去生成一个lib文件.下面就介绍如何将dll文件去生成对应的lib文件 1.生 ...

  9. java调用C或者C++动态库dll

    java调用C或者C++动态库dll,本文章使用的是IntelliJ IDEA Community Edition 2021.2.3版本测试的 1.新建项目 linjie.demo,添加类HelloL ...

最新文章

  1. SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器
  2. BCZM : 1.13
  3. 发布一个博客园专用Windows Live Writer代码插件
  4. RuntimeError: DataLoader worker (pid(s) 13512, 280, 21040) exited unexpectedly
  5. Delphi以GDI+制作桌面歌词效果
  6. [转]MySQL索引背后的数据结构及算法原理
  7. 尼日利亚年轻人推动该国登上比特币谷歌搜索排名榜首
  8. 本地算术验证码识别教程
  9. LeetCode_database刷题记录(627. 交换工资)
  10. clone远程代码 在不同电脑上git_Git 如何 clone 远程 非 master 分支的代码
  11. onvif协议之初探
  12. 41. 和为s的两个数字VS和为s的连续正数序列(C++版本)
  13. 大型综合办公管理系统源码(OA+HR+CRM)源码免费分享
  14. Excel比较两列的值
  15. 计算机电源检测软件,电脑电源检测工具
  16. Android手机开启开发者模式
  17. 使用video speed controller给视频加速
  18. iPhone设备上安装beta版本系统,在浏览器中搜索网址 beta.apple.com
  19. IDEA中的TODO使用和Debug史诗级详细使用说明
  20. 炼数成金 mysql_MySQL DBA从小白到大神实战 MySQL运维DBA课程 炼数成金MySQL企业运维视频教程...

热门文章

  1. 精通安卓性能优化-第五章(三)
  2. Softmax-with-Loss层的计算图 | Softmax梯度推导 | Loss损失函数
  3. 电脑如何在线制作文件二维码?二维码怎么下载文件?
  4. 除了同性交友平台 GitHub,程序员们业余时间还可以去哪儿?
  5. 微信小游戏开发实战教程2-使用表格处理数据
  6. checkpoints are occurring too frequently
  7. 超详细!!vue、vue-cli脚手架项目使用prerender-spa-plugin,解决SEO并为其添加title,keyWords,descript
  8. python实现中考倒计时
  9. 8种bootstrap团队会员头像样式代码
  10. 用python画一个蜡笔小新