两个库都有MD5.h,重定义或无法解析的外部符号,得删除一个。
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2001 无法解析的外部符号 _md5_starts AppManage D:\010F200\svn\ProduceToolMfc\AppManage\ScanLicenceInfoUpload\x509parse.obj 1
错误 LNK2001 无法解析的外部符号 _md5 AppManage D:\010F200\svn\ProduceToolMfc\AppManage\ScanLicenceInfoUpload\x509parse.obj 1
错误 LNK2001 无法解析的外部符号 _md5_finish AppManage D:\010F200\svn\ProduceToolMfc\AppManage\ScanLicenceInfoUpload\x509parse.obj 1
错误 LNK2001 无法解析的外部符号 _md5_update AppManage D:\010F200\svn\ProduceToolMfc\AppManage\ScanLicenceInfoUpload\x509parse.obj 1
错误 LNK1120 4 个无法解析的外部命令 AppManage D:\010F200\svn\ProduceToolMfc\AppManage\Release\AppManage.exe 1
"PWSTR" 类型的实参与 "PSTR" 类型的形参不兼容,为了显示中文直接函数后加W 。
获取串口列表,自动获取串口号
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <Windows.h>
#include <setupapi.h>
#pragma comment(lib, "setupapi.lib")
char * wideCharToMultiByte(wchar_t* pWCStrKey)
{
//第一次调用确认转换后单字节字符串的长度,用于开辟空间
int pSize = WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), NULL, 0, NULL, NULL);
char* pCStrKey = new char[pSize + 1];
//第二次调用将双字节字符串转换成单字节字符串
WideCharToMultiByte(CP_OEMCP, 0, pWCStrKey, wcslen(pWCStrKey), pCStrKey, pSize, NULL, NULL);
pCStrKey[pSize] = '\0';
return pCStrKey;
//如果想要转换成string,直接赋值即可
//string pKey = pCStrKey;
//return pKey;
}
//获取特定串口号 示例Qualcomm HS-USB Diagnostics 9091 (COM20)
string getSpecialComNum(const char *in)
{
char out[100] = { 0 };
sscanf_s(in, "Qualcomm HS-USB Diagnostics 9091 (COM%[0-9])", out, sizeof(out)); //不是%d哦
return out;
}
//从设备信息中 获取特定串口号 @return <=0无效
int getSpecialComNumFromDevInfo()
{
HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
printf("SetupDiGetClassDevs Err:%d", GetLastError());
return -2;
};
SP_CLASSIMAGELIST_DATA _spImageData = { 0 };
_spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
SetupDiGetClassImageList(&_spImageData);
SP_DEVINFO_DATA spDevInfoData = { 0 };
spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
{
char szBuf[MAX_PATH] = { 0 };
int wImageIdx = 0;
short wItem = 0;
if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_CLASS, NULL, (PBYTE)szBuf, MAX_PATH, 0))
{
continue;
};
if (strcmp(szBuf, "Ports") != 0) //只取端口
{
continue;
}
printf("Class1:%s\r\n", szBuf);
if (SetupDiGetClassImageIndex(&_spImageData, &spDevInfoData.ClassGuid, &wImageIdx))
{
char szName[MAX_PATH] = { 0 };
DWORD dwRequireSize;
if (!SetupDiGetClassDescriptionW(&spDevInfoData.ClassGuid, (PWSTR)szBuf, MAX_PATH, &dwRequireSize))
{
continue;
};
wprintf(L"Class:%s\r\n", szBuf);
if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0))
{
wprintf(L"FriendlyName:%s\r\n\r\n", szName);
int comNum = atoi(getSpecialComNum(wideCharToMultiByte((wchar_t *)szName)).c_str());
if (comNum > 0)
{
return comNum;
}
}
else if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0))
{
wprintf(L"Device:%s\r\n\r\n", szName);
}
}
}
SetupDiDestroyClassImageList(&_spImageData);
return -1;
}