X
xf47
Unregistered / Unconfirmed
GUEST, unregistred user!
请大家帮忙看一下我把C的代码转成DELPHI的时候那里有问题?<br>×××××这是我在网上查到的VC的代码××××××<br>// IOCTL控制码<br>#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)<br>// 存储设备的总线类型<br>typedef enum _STORAGE_BUS_TYPE {<br> BusTypeUnknown = 0x00,<br> BusTypeScsi,<br> BusTypeAtapi,<br> BusTypeAta,<br> BusType1394,<br> BusTypeSsa,<br> BusTypeFibre,<br> BusTypeUsb,<br> BusTypeRAID,<br> BusTypeMaxReserved = 0x7F<br>} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;<br> <br>// 查询存储设备属性的类型<br>typedef enum _STORAGE_QUERY_TYPE {<br> PropertyStandardQuery = 0, // 读取描述<br> PropertyExistsQuery, // 测试是否支持<br> PropertyMaskQuery, // 读取指定的描述<br> PropertyQueryMaxDefined // 验证数据<br>} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;<br> <br>// 查询存储设备还是适配器属性<br>typedef enum _STORAGE_PROPERTY_ID {<br> StorageDeviceProperty = 0, // 查询设备属性<br> StorageAdapterProperty // 查询适配器属性<br>} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;<br> <br>// 查询属性输入的数据结构<br>typedef struct _STORAGE_PROPERTY_QUERY {<br> STORAGE_PROPERTY_ID PropertyId; // 设备/适配器<br> STORAGE_QUERY_TYPE QueryType; // 查询类型 <br> UCHAR AdditionalParameters[1]; // 额外的数据(仅定义了象征性的1个字节)<br>} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;<br> <br>// 查询属性输出的数据结构<br>typedef struct _STORAGE_DEVICE_DESCRIPTOR {<br> ULONG Version; // 版本<br> ULONG Size; // 结构大小<br> UCHAR DeviceType; // 设备类型<br> UCHAR DeviceTypeModifier; // SCSI-2额外的设备类型<br> BOOLEAN RemovableMedia; // 是否可移动<br> BOOLEAN CommandQueueing; // 是否支持命令队列<br> ULONG VendorIdOffset; // 厂家设定值的偏移<br> ULONG ProductIdOffset; // 产品ID的偏移<br> ULONG ProductRevisionOffset; // 产品版本的偏移<br> ULONG SerialNumberOffset; // 序列号的偏移<br> STORAGE_BUS_TYPE BusType; // 总线类型<br> ULONG RawPropertiesLength; // 额外的属性数据长度<br> UCHAR RawDeviceProperties[1]; // 额外的属性数据(仅定义了象征性的1个字节)<br>} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;<br> <br>// 取设备属性信息<br>// hDevice -- 设备句柄<br>// pDevDesc -- 输出的设备描述和属性信息缓冲区指针(包含连接在一起的两部分)<br>BOOL GetDriveProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)<br>{<br> STORAGE_PROPERTY_QUERY Query; // 查询输入参数<br> DWORD dwOutBytes; // IOCTL输出数据长度<br> BOOL bResult; // IOCTL返回值<br> <br> // 指定查询方式<br> Query.PropertyId = StorageDeviceProperty;<br> Query.QueryType = PropertyStandardQuery;<br> <br> // 用IOCTL_STORAGE_QUERY_PROPERTY取设备属性信息<br> bResult = :eviceIoControl(hDevice, // 设备句柄<br> IOCTL_STORAGE_QUERY_PROPERTY, // 取设备属性信息<br> &Query, sizeof(STORAGE_PROPERTY_QUERY), // 输入数据缓冲区<br> pDevDesc, pDevDesc->Size, // 输出数据缓冲区<br> &dwOutBytes, // 输出数据长度<br> (LPOVERLAPPED)NULL); // 用同步I/O <br> <br> return bResult;<br>}<br>×××××这是我翻译成DELPHI的代码,可是老有问题!×××××××<br>const<br> Method_Buffered = 0;<br> File_Any_Access = 0;<br> File_Device_Mass_Storage = $0000002D;<br> IOCTL_Storage_Base = File_Device_MASS_Storage;// $002D<br><br>type<br>// 存储设备的总线类型<br> pSTORAGE_BUS_TYPE=^STORAGE_BUS_TYPE;<br> STORAGE_BUS_TYPE =(<br> BusTypeUnknown = $00,<br> BusTypeScsi,<br> BusTypeAtapi,<br> BusTypeAta,<br> BusType1394,<br> BusTypeSsa,<br> BusTypeFibre,<br> BusTypeUsb,<br> BusTypeRAID,<br> BusTypeMaxReserved = $7F<br>);<br><br>// 查询存储设备属性的类型<br> pSTORAGE_QUERY_TYPe=^STORAGE_QUERY_TYPE;<br> STORAGE_QUERY_TYPE =(<br> PropertyStandardQuery = 0, // 读取描述<br> PropertyExistsQuery, // 测试是否支持<br> PropertyMaskQuery, // 读取指定的描述<br> PropertyQueryMaxDefined // 验证数据<br>);<br><br>// 查询存储设备还是适配器属性<br>pSTORAGE_PROPERTY_ID=^PSTORAGE_PROPERTY_ID;<br>STORAGE_PROPERTY_ID =(<br> StorageDeviceProperty = 0, // 查询设备属性<br> StorageAdapterProperty // 查询适配器属性<br>);<br><br>// 查询属性输入的数据结构<br>PSTORAGE_PROPERTY_QUERY=^STORAGE_PROPERTY_QUERY;<br>STORAGE_PROPERTY_QUERY = packed record<br> PropertyId:STORAGE_PROPERTY_ID ; // 设备/适配器<br> QueryType:STORAGE_QUERY_TYPE ; // 查询类型<br> AdditionalParameters:string[1]; // 额外的数据(仅定义了象征性的1个字节)<br>end;<br><br><br>// 查询属性输出的数据结构<br>PSTORAGE_DEVICE_DESCRIPTOR=^STORAGE_DEVICE_DESCRIPTOR;<br>STORAGE_DEVICE_DESCRIPTOR = packed record<br> Version:ULONG; // 版本<br> Size:ULONG; // 结构大小<br> DeviceType:UCHAR; // 设备类型<br> DeviceTypeModifier:UCHAR; // SCSI-2额外的设备类型<br> RemovableMedia:Boolean; // 是否可移动<br> CommandQueueing:Boolean; // 是否支持命令队列<br> VendorIdOffset:Ulong; // 厂家设定值的偏移<br> ProductIdOffset:ULONG; // 产品ID的偏移<br> ProductRevisionOffset:ULONG; // 产品版本的偏移<br> SerialNumberOffset:ULONG; // 序列号的偏移<br> BusType:STORAGE_BUS_TYPE ; // 总线类型<br> RawPropertiesLength:ULONG; // 额外的属性数据长度<br> RawDeviceProperties:string[1]; // 额外的属性数据(仅定义了象征性的1个字节)} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;<br>end;<br><br>function GetDriveProperty(hDevice:Thandle;pDevDescSTORAGE_DEVICE_DESCRIPTOR):Boolean;<br>function Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;<br><br>implementation<br><br>function Ctl_Code(DeviceType, FuncNo, Method, Access: integer): integer;<br>begin<br> Result:= (DeviceType shl 16) or (Access shl 14) or (FuncNo shl 2) or (Method)<br>end;<br><br>function GetDriveProperty(hDevice:Thandle;pDevDescSTORAGE_DEVICE_DESCRIPTOR):Boolean;<br>var<br> Query:STORAGE_PROPERTY_QUERY; // 查询输入参数<br> dwOutBytesword; // IOCTL输出数据长度<br> IOCTL_STORAGE_QUERY_PROPERTY:integer;<br>begin<br> // 指定查询方式<br> IOCTL_STORAGE_QUERY_PROPERTY:=Ctl_Code(IOCTL_STORAGE_BASE, $0500, METHOD_BUFFERED, FILE_ANY_ACCESS);<br> Query.PropertyId:= StorageDeviceProperty;<br> Query.QueryType:= PropertyStandardQuery;<br> Result:=DeviceIoControl(hDevice, // 设备句柄<br> IOCTL_STORAGE_QUERY_PROPERTY , // 取设备属性信息<br> @Query,<br> sizeof(Query), // 输入数据缓冲区<br> pDevDesc, // 输出数据缓冲区<br> pDevDesc.Size, // 输出数据长度<br> dwOutBytes,<br> nil); // 用同步I/O<br>end;<br>end.