Witam. Aktualnie zawiesiłem tłumaczene C&Cddraw na rzecz tłumaczenia nieco mniej rozbudowanej biblioteki ddhack dla WingCommanderów. Celem jest próba stworzenia ddraw.dll do uruchomienia starszych gier pod Windows 7 i Vista bez ubijania explorer.exe i innych cudów tak aby grafika się nie kaszaniła. Mam w związku z tłumaczeniem kodu, jako że z C/C++ ze mnie totalna lama, co szczerze przyznaje - takie pytania. Tłumaczę Interface IDirectDrawPalette. I tutaj pierwsze pytanie. Czy typ `LPPALETTEENTRY' na przykład tak użyty:

myIDDrawPalette::myIDDrawPalette(DWORD aFlags, LPPALETTEENTRY aPalette)
{
    logf("myIDDrawPalette Constructor");
    // Could check aFlags for DDCAPS_8BIT, but that's basically
    // the only sane mode.. right?
    memcpy(mPal, aPalette, sizeof(PALETTEENTRY) * 256);
}

to na pewno będzie Pointer? Bo w Delphi mam tak:

constructor TMyIDDrawPalette.Create(aFlags : DWORD; aPalette : Pointer);
begin
  logf('myIDDrawPalette Constructor');
  // Could check aFlags for DDCAPS_8BIT, but that's basically
  // the only sane mode.. right?
  CopyMemory(mPal, aPalette, SizeOf(aPalette) * 256);
end;

Ale wygooglowałem przykład kodu gdzie definicja typu `LPPALETTEENTRY' w Delphi wygląda tak:

type
  PPaletteEntry = ^TPaletteEntry;
  tagPALETTEENTRY = record
    peRed : BYTE;
    peGreen : BYTE;
    peBlue : BYTE;
    peFlags : BYTE;
  end;
  PALETTEENTRY = tagPALETTEENTRY;
  LPPALETTEENTRY = ^PALETTEENTRY;

I tak używana była ona z polami pe... w kodzie C&Cddraw pisanym w C. Jednak moje wątpliwości budzi fragment plików nagłowkowych SDK DirectX'a, bo w C++ dla Interface'u IDirectDraw mamy:

    STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE;

Natomiast w Delphi:

    function CreatePalette(dwFlags : DWORD; lpColorTable : Pointer;
      out lplpDDPalette : IDirectDrawPalette;
      pUnkOuter : IUnknown) : HResult; stdcall;

I stąd moje pytanie z tym typem.

Drugie pytanie zaś. Jak przetłumaczyć ten fragment. Bo nie za bardzo wiem, jak dodawać do siebie Pointer i DWORD'a. W C++ mam:

HRESULT  __stdcall myIDDrawPalette::SetEntries(DWORD aFlags,DWORD aStartEntry,DWORD aCount,LPPALETTEENTRY aPalEntries)
{
    logf("myIDDrawPalette::SetEntries(%d,%d,%d,%08x)", aFlags, aStartEntry, aCount, aPalEntries);
    memcpy(mPal + aStartEntry, aPalEntries, aCount * sizeof(PALETTEENTRY));
    updatescreen();
    return NOERROR;
}

Natomiast w Delphi, korzystając z metod interface'u IDirectDrawPalette, ktorego ten kod dotyczy zrobiłem:

function TMyIDDrawPalette.SetEntries(dwFlags : DWORD; dwStartingEntry : DWORD;
  dwCount : DWORD; lpEntries : Pointer) : HResult; stdcall;
begin
  logf('TMyIDDrawPalette.SetEntries(%d,%d,%d,%08x)', dwFlags, dwStartingEntry, dwCount, lpEntries);
  DWORD(mPal) := DWORD(mPal) + dwStartingEntry;
  CopyMemory(mPal, lpEntries, dwCount * SizeOf(lpEntries));
  updatescreen();
  Result := NOERROR;
end;

Ale to chyba źle. Bo w pliku nagłowkowym C++ mam:

    PALETTEENTRY mPal[256];

Ale zgodnie z powyższymi wątpliwościami w pytaniu pierwszym w Delphi zrobiłem tak:

    mpal : Pointer;

Proszę o pomoc w moich powyższych problemach. Z góry serdecznie dziękuję. I dodam, że liczę nie tylko na Azariena, kto będzie wiedział proszę niech napisze.