2012-01-18 4 views
4

DeviceIoControl 함수로 작업 중이므로 해당 함수에 IOCTL_ATA_PASS_THROUGH 값을 전달해야합니다. 이 상수에 대한 델파이 변환을 찾을 수 없습니다. 단지이 C++ 정의를 찾았습니다.델파이에서 IOCTL_ATA_PASS_THROUGH를 어떻게 정의 할 수 있습니까?

# define IOCTL_ATA_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 

그러나이 값을 CTL_CODE 매크로를 사용하여 해당 값을 델파이로 변환하는 데 문제가 있습니다. 질문은 델파이에서 IOCTL_ATA_PASS_THROUGH를 정의 할 수있는 방법입니까? 하지만 회로 델파이는 매크로를 지원하지 않습니다,하지만 당신은 만들 수 있습니다

답변

9

CTL_CODE 매크로

#define CTL_CODE(DeviceType, Function, Method, Access) (
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) 
) 

는 그래서 IOCTL_ATA_PASS_THROUGH 형 구조 델파이에 해당이

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

주 같은 것입니다으로 정의된다 함수

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; 

그리고 값은 ru 이런 식으로 n 시간

Flag:=CTL_CODE(IOCTL_SCSI_BASE, $040B , METHOD_BUFFERED, (FILE_READ_ACCESS or FILE_WRITE_ACCESS)); 
+0

하지만이 자료를 Delphi에서 사용할 수 있습니까? 그 운전자는 구체적이지 않습니까? (+1) – TLama

+2

예, 델파이에서 사용할 수 있습니다 (예 : S.M.A.R.T. hdd의 데이터. – RRUZ

1

이 값은 $0004d02c입니다. 나는 다음의 C 프로그램으로 이것을 얻었다.

#include <windows.h> 
#include <Ntddscsi.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    printf("%.8x", IOCTL_ATA_PASS_THROUGH); 
    return 0; 
} 

나는 개인적으로 번역을 시도하는 것보다 실제 윈도우 헤더 파일을 사용하는 것이 안전하다고 느끼지만, 나는 C에 대해 충분히 모른다해서 아마도 그건!

관련 문제