Sal*_*dor 4 c++ delphi winapi delphi-xe
我正在使用 DeviceIoControl函数,我需要将IOCTL_ATA_PASS_THROUGH值传递给该函数.我找不到这个常量的任何delphi翻译,只是我找到了这个C++定义.
# define IOCTL_ATA_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
Run Code Online (Sandbox Code Playgroud)
但我有问题使用CTL_CODE宏将该值转换为delphi .问题是如何在delphi中定义IOCTL_ATA_PASS_THROUGH?
CTL_CODE宏定义为
#define CTL_CODE(DeviceType, Function, Method, Access) (
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
)
Run Code Online (Sandbox Code Playgroud)
所以IOCTL_ATA_PASS_THROUGHconst 的delphi等价物是这样的
uses
Windows;
const
//#define IOCTL_ATA_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
IOCTL_SCSI_BASE = FILE_DEVICE_CONTROLLER;
IOCTL_ATA_PASS_THROUGH= (IOCTL_SCSI_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14) or ($040B shl 2) or (METHOD_BUFFERED);
Run Code Online (Sandbox Code Playgroud)
注意:遗憾的是delphi不支持宏,但您可以创建一个函数
function CTL_CODE(DeviceType, _Function, Method, Access: Cardinal): Cardinal;
begin
Result := (DeviceType shl 16) or (Access Shl 14) or (_Function shl 2) or (Method);
end;
Run Code Online (Sandbox Code Playgroud)
并以这种方式获取运行时的值
Flag:=CTL_CODE(IOCTL_SCSI_BASE, $040B , METHOD_BUFFERED, (FILE_READ_ACCESS or FILE_WRITE_ACCESS));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |