Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1704
Erhaltene Danke: 307

[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 12: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 !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)