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.