C++动态库dll生成及调用总结
本文主要总结将类生成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生成及调用总结相关推荐
- C++中.lib静态库、.dll动态库的生成及调用2
关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...
- C++中.lib静态库、.dll动态库的生成及调用1
一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...
- 【Linux】静态库与动态库的生成及调用
一,库:一种可执行代码的二进制形式,可以被载入内存执行.其中库分为静态库.动态库 二,静态库和动态库的区别 1)Linux 下静态库:名字一般为 lib***.a利用静态函数库编译成 ...
- C#.net调用动态库dll注意事项
C#.net调用动态库dll注意事项 本文主要描述作者在工作中所遇到技术难点及问题,最后提出相关的解决方案 场景 公司有个业务需求涉及到ID读卡器,构建成在ID卡读卡器一刷ID卡,系统就自动显示其ID ...
- Windows下动态链接库和静态链接库的生成以及调用
Windows下静态库和动态库的生成和调用 一.简介 二.生成静态链接库(.lib)和动态链接库(.dll) 三.静态链接库的调用 四.动态链接库的调用 动态链接库的两种调用方式 仅使用.dll文件 ...
- c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序
引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...
- C#总结:C#调用C++的动态库Dll遇到的问题[动态库调用/结构体指针调用/union共同体定义]
记录使用C#调用C++的生成的DLL手柄键盘驱动库包括****.sys(驱动文件)和****.dll(库文件)的全部问题. C#调用C++的库有两种:静态调用和动态调用 静态调用,使用.net 提供的 ...
- c++由动态库dll文件生成lib文件的方法
很多动态库dll文件,并没有附带lib文件,因此就无法以静态加载的方式去使用.但是此问题也是有解决办法的,就是从dll文件去生成一个lib文件.下面就介绍如何将dll文件去生成对应的lib文件 1.生 ...
- java调用C或者C++动态库dll
java调用C或者C++动态库dll,本文章使用的是IntelliJ IDEA Community Edition 2021.2.3版本测试的 1.新建项目 linjie.demo,添加类HelloL ...
最新文章
- SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器
- BCZM : 1.13
- 发布一个博客园专用Windows Live Writer代码插件
- RuntimeError: DataLoader worker (pid(s) 13512, 280, 21040) exited unexpectedly
- Delphi以GDI+制作桌面歌词效果
- [转]MySQL索引背后的数据结构及算法原理
- 尼日利亚年轻人推动该国登上比特币谷歌搜索排名榜首
- 本地算术验证码识别教程
- LeetCode_database刷题记录(627. 交换工资)
- clone远程代码 在不同电脑上git_Git 如何 clone 远程 非 master 分支的代码
- onvif协议之初探
- 41. 和为s的两个数字VS和为s的连续正数序列(C++版本)
- 大型综合办公管理系统源码(OA+HR+CRM)源码免费分享
- Excel比较两列的值
- 计算机电源检测软件,电脑电源检测工具
- Android手机开启开发者模式
- 使用video speed controller给视频加速
- iPhone设备上安装beta版本系统,在浏览器中搜索网址 beta.apple.com
- IDEA中的TODO使用和Debug史诗级详细使用说明
- 炼数成金 mysql_MySQL DBA从小白到大神实战 MySQL运维DBA课程 炼数成金MySQL企业运维视频教程...
热门文章
- 精通安卓性能优化-第五章(三)
- Softmax-with-Loss层的计算图 | Softmax梯度推导 | Loss损失函数
- 电脑如何在线制作文件二维码?二维码怎么下载文件?
- 除了同性交友平台 GitHub,程序员们业余时间还可以去哪儿?
- 微信小游戏开发实战教程2-使用表格处理数据
- checkpoints are occurring too frequently
- 超详细!!vue、vue-cli脚手架项目使用prerender-spa-plugin,解决SEO并为其添加title,keyWords,descript
- python实现中考倒计时
- 8种bootstrap团队会员头像样式代码
- 用python画一个蜡笔小新