当isung BCC32时,C ++函数崩溃,但与BCC32c一起使用

时间:2017-11-01 10:41:03

标签: c++ clang c++builder borland-c++

使用“经典”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次即使使用预编译头文件,编译时间也简直难以忍受。

0 个答案:

没有答案