2

テストプログラムが終了するときに、いくつかのデバッグアサートに苦労しています。目的は、セットアップAPIを使用してディスクドライブへのデバイスパスを取得することです。これをやっています。ここで説明するSetupDiGetDeviceInterfaceDetailのルールに従います。つまり、SetupDiGetDeviceInterfaceDetail()を呼び出して構造に必要なサイズを決定し、構造にメモリを割り当てて、SetupDiGetDeviceInterfaceDetail()を再度呼び出します。

このプロセスは機能し、必要なデータを取得しています。正しく機能していないのは、プログラムが終了したとき、またはメモリを直接削除したときに、デバッグアサーションが発生することです。アサーションウィンドウには、問題が見つかったファイルdbgdel.cppが52行目にあります。問題:「式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)」。

何が問題なのかわかりません。使用しているすべてのコードを削除し、すべてのセットアップAPI呼び出しなしでSP_DEVICE_INTERFACE_DETAIL_DATAオブジェクトを新しくすると、削除の呼び出しが機能します。基本的に、これが私がしていることです:

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;
4

0 に答える 0