Я борюсь с некоторыми утверждениями отладки, когда моя тестовая программа завершается.Цель состоит в том, чтобы получить путь к устройству с помощью API установки.Это я делаю.Я следую описанному здесь правилу для SetupDiGetDeviceInterfaceDetail , то есть вызываю SetupDiGetDeviceInterfaceDetail (), чтобы определить размер, необходимый для структуры, и выделяю память для структуры, и снова вызываю SetupDiGetDeviceInterfaceDetail ().
Этопроцесс работает, и я получаю данные, которые мне нужны.Что не работает правильно, так это то, что когда программа закрывается или я удаляю память напрямую, я получаю отладочное утверждение.В окне подтверждения есть файл, в котором обнаружена проблема, dbgdel.cpp, в строке 52. Проблема: «Выражение: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)».
Я не уверен, в чем проблема,Если я удаляю весь код, который использую, и создаю новый объект SP_DEVICE_INTERFACE_DETAIL_DATA без всех вызовов API установки, вызов удаления работает.По сути, вот что я делаю:
HDEVINFO hDevs = SetupDiGetClassDevs(&DiskClassGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
SP_DEVICE_INTERFACE_DATA devInterfaceData = {sizeof(SP_DEVICE_INTERFACE_DATA)};
DWORD size(0);
SetupDiEnumDeviceInterfaces(hDevs, NULL, &DiskClassGuid, 0, &devInterfaceData);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetails(NULL);
SetupDiGetDeviceInterfaceDetail(hDevs, &devInterfaceData, pDetails, 0, &size, NULL);
pDetails = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new BYTE[sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + size]);
// zero allocated memory
pDetails->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SetupDiGetDeviceInterfaceDetail(hDevs, &devInterfaceData, pDetails, size, NULL, NULL);
delete[] pDetails;
Когда программа закрывается или вызывается delete [], появляется упомянутое ранее утверждение.Пожалуйста, объясните мне, что я делаю неправильно.
Спасибо, Энди
ОБНОВЛЕНИЕ: Забыли добавить определение SP_DEVICE_INTERFACE_DETAIL_DATA.Это можно найти здесь .Тем не менее, это выглядит так:
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA {
DWORD cbSize;
TCHAR DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA;