Kod C++ na Delphi - kto mi pomoze?

0

Mam tak:

#define FILE_DEVICE_SOUND 0x1d
#define IOCTL_SOUND_BASE  FILE_DEVICE_SOUND
#define IOCTL_WAVE_BASE   0
#define METHOD_BUFFERED   0

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

#define IOCTL_WAVE_SET_MIXER CTL_CODE(IOCTL_SOUND_BASE, IOCTL_WAVE_BASE + 0x0031, METHOD_BUFFERED, FILE_READ_ACCESS)

Jak to zrobić w Object Pascalu? Z góry dziekuję.

Pozdrowienia,
Jacek

0

Mam tak:

#define FILE_DEVICE_SOUND 0x1d
#define IOCTL_SOUND_BASE  FILE_DEVICE_SOUND
#define IOCTL_WAVE_BASE   0
#define METHOD_BUFFERED   0

To na pewno mozna zastąpić zwykłymi const'ami...

const
 FILE_DEVICE_SOUND = $1d;
 IOCTL_SOUND_BASE = FILE_DEVICE_SOUND;
 IOCTL_WAVE_BASE = 0;
 METHOD_BUFFERED = 0;

Ewentualnie inicjowanymi zmiennymi :) Ale co z dalszą częscią - nie wiem...

0
const
FILE_DEVICE_SOUND=$1d;
IOCTL_SOUND_BASE=FILE_DEVICE_SOUND;
IOCTL_WAVE_BASE=0;
METHOD_BUFFERED=0;
{
tutaj jest makro, ale trzeba to na funkcje zamienic
Niestety, ale procedury musza mieć wyszczególnione typy, więc dostosuj do takiego, jakiego potrzebujesz
}
procedure CTL_CODE(DeviceType, Function, Method, Access: Integer) ;
begin
  Result := ((DeviceType) shl 16) or ((Access) shl 14) or ((Function) shl 2) or (Method);
end;
{ ostatniego nie bardzo wiem jak ugryźć. Niestety preprocesor w C jest cudowną rzeczą, jakiej brakuje w Delphi :( }
0

Coś zaczynam kumać, tylko ten FILE_READ_ACCESS.

Drąże dalej ;-) To funkcja, która korzysta z tych danych:

DeviceIoControl(hDev, IOCTL_WAVE_SET_MIXER, DataIn, sizeof(DataIn), DataOut, sizeof(DataOut), &BytesReturned, NULL))

Z helpa SDK:

BOOL DeviceIoControl(

    HANDLE hDevice,	// handle to device of interest
    DWORD dwIoControlCode,	// control code of operation to perform
    LPVOID lpInBuffer,	// pointer to buffer to supply input data
    DWORD nInBufferSize,	// size of input buffer
    LPVOID lpOutBuffer,	// pointer to buffer to receive output data
    DWORD nOutBufferSize,	// size of output buffer
    LPDWORD lpBytesReturned,	// pointer to variable to receive output byte count
    LPOVERLAPPED lpOverlapped 	// pointer to overlapped structure for asynchronous operation
   );

Kompilator mi daje błąd niezgodności typu, zatrzymując się za lpBytesReturned. A mam tak:

DeviceIoControl(hDev, IOCTL_WAVE_SET_MIXER, @DataIn, SizeOf(DataIn), @DataOut, SizeOf(DataOut), BytesReturned, nil);

gdzie:

DataIn: array[0..1] of Longword;
DataOut: array[0..1] of Longword;
BytesReturned: LPDWORD;
hDev: integer;

LPOVERLAPPED - co to jest? Albo inaczej, czy podając tu nil (NULL) robię coś nie tak?

Pozdrawiam,
Jacek

0

OK, poradzilem sobie. Dzięki za pomoc. FILE_READ_ACCESS = 1

Pozdrawiam,
Jacek

1 użytkowników online, w tym zalogowanych: 0, gości: 1