Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1529
Erhaltene Danke: 276

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 16.05.17 13:36 
Hallo Forum

Problemstellung:
Ich versuche die Konstante SMART_SEND_DRIVE_COMMAND von C++ nach Delphi zu übersetzen, die wie folgt deklariert ist:

ausblenden C++-Quelltext
1:
2:
public const SMART_SEND_DRIVE_COMMAND: DWORD = CTL_CODE!(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED,
    FILE_READ_ACCESS | FILE_WRITE_ACCESS)

Das Problem besteht beim Makro CTL_CODE, dessen Funktionsweise ich nicht kenn'.
Alternativ habe ich mir den Wert in VC++ ausgeben lassen: (0x7c084)

ausblenden C++ Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
  printf("%x\n", SMART_SEND_DRIVE_COMMAND);
  return 0;
}


Dennoch wüsste ich gern, wie ich SMART_SEND_DRIVE_COMMAND in Delphi deklarieren könnte, ohne den Wert zu kennen ?!

Die dazugehörigen Konstanten wären:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
const
  IOCTL_DISK_BASE    = 7;  { FILE_DEVICE_CONTROLLER }
  METHOD_BUFFERED    = 0;
  FILE_READ_ACCESS   = 1;  { FILE_READ_DATA }
  FILE_WRITE_ACCESS  = 2;  { FILE_WRITE_DATA }


Danke für's mitdenken!


Nachtrag

Habe nun doch noch die Definition von CTL_CODE im VC++ (winioctl.h) gefunden:

ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Macro definition for defining IOCTL and FSCTL function control codes.  Note
// that function codes 0-2047 are reserved for Microsoft Corporation, and
// 2048-4095 are reserved for customers.
//

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

Dementsprechend würde die Konstante unter Delphi so aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
const SMART_SEND_DRIVE_COMMAND = (IOCTL_DISK_BASE shl 16or
                                 ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14or
                                 ($0021 shl 2or METHOD_BUFFERED;
// Aufruf
begin
  ShowMessageFmt('%x', [SMART_SEND_DRIVE_COMMAND]);  // = 7C084
end;


Das Thema hat sich erledigt !!!

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)