使用“经典”BCC32编译器编译中型内部应用程序时,Embarcadero C ++ Builder 10.2.2存在非常严重的问题。
有一个类包含一些DLL函数,负责读取用于连接接口的可用硬件USB接口盒的数量,并将它们的序列号作为字符串。使用 BCC32 以及 BCC32c 时,下面的代码编译没有缺陷,但在运行时 BCC32 < / em>版本崩溃可怕,而一切都适用于 BCC32c 。
在两种情况下都成功检测到已连接设备的数量(在我的设置中为2
),而不是在
UsbDeviceSerialNo
FDllPointers.GetUSBDeviceSN()
(例如126739701012387721219679016621
)那里只有垃圾:
��\x18
。
在
的第二次迭代中 for (unsigned int UsbDeviceNo = 0; UsbDeviceNo < 32; ++UsbDeviceNo)
地址00000000 中的'访问冲突
memset(UsbDeviceSerialNo, 0, SerNoBufferSize);
std::size_t TComUsbRoot::RefreshInterfaces()
{
// Note: This function does not work correctly when compiled
// with Borland BCC32 due to offset errors and AVs!!
// I don't have a clue, why this is the case at the moment.
const unsigned int SerNoBufferSize = 40;
unsigned long UsbDeviceMask = 0;
char UsbDeviceSerialNo[SerNoBufferSize];
// Clear the current interfaces
FInterfaces.clear(); // <-- std::vector<TComUsbInterface>
// Get the currently available interface count
int InterfaceCount = FDllPointers.GetAvailableUSBDevices(&UsbDeviceMask); // <-- int WINAPI CC_GetAvailableUSBDevices(unsigned long * DeviceMask); (from DLL)
// We need at least one interface to proceed
if (!InterfaceCount)
return 0;
// Check all USB device numbers
for (unsigned int UsbDeviceNo = 0; UsbDeviceNo < 32; ++UsbDeviceNo)
{
// Check the USB device mask
if (((1 << UsbDeviceNo) & UsbDeviceMask) != 0)
{
// Set the serial no to zeroes
memset(UsbDeviceSerialNo, 0, SerNoBufferSize);
// Get the USB device's serial number
int Result = FDllPointers.GetUSBDeviceSN(
UsbDeviceNo,
UsbDeviceSerialNo,
SerNoBufferSize
);
if (Result != 0)
{
throw Except(
std::string("ComUSB: Error while reading the USB device's serial number")
);
}
// Convert the serial number to wstring
std::wstring SerialNo(CnvToWStr(UsbDeviceSerialNo));
// Create a new interface object with the USB device's parameters
TComUsbInterface Interface(
*this,
UsbDeviceNo,
SerialNo,
FDllPointers,
FLanguage
);
// Add it to the vector
FInterfaces.push_back(Interface);
}
}
// Return the size of the interfaces vector
return FInterfaces.size();
}
我根本不知道这里有什么问题,因为基于Clang的新编译器一切都很好。不幸的是我无法在这个项目中使用新的编译器,因为代码完成(在C ++ Builder中基于编译器并且基于编译器,感觉就像使用早期的BETA版本的somtehing)会使IDE每小时崩溃5次即使使用预编译头文件,编译时间也简直难以忍受。