Zitat von
jim_raynor:
Zitat von
Dezipaitor:
Frage:
Wie würde man den untenstehenden Quelltext schreiben, ohne absolute zu verwenden?
Delphi-Quellcode:
type
//aus jwaACLui.pas
PSI_ACCESS = ^SI_ACCESS;
{$EXTERNALSYM PSI_ACCESS}
_SI_ACCESS = record
pguid: LPGUID;
mask: ACCESS_MASK;
pszName: LPCWSTR; // may be resource ID
dwFlags: DWORD;
end;
{$EXTERNALSYM _SI_ACCESS}
SI_ACCESS = _SI_ACCESS;
{$EXTERNALSYM SI_ACCESS}
TSiAccess = SI_ACCESS;
PSiAccess = PSI_ACCESS;
IMO sollte es funktionieren, wenn PSI_ACCESS als Pointer auf ein Statisches Array definiert wird. Also:
Delphi-Quellcode:
type
PSI_ACCESS = ^TSI_ACCESS;
TSI_ACCESS_Array = Array[0..high(Integer)] of SI_ACCESS;
Natürlich darfst du so nie eine Variable direkt vom Typ TSI_ACCESS_Array anlegen, da sonst dein Stack sein voll dürfte.
Ich hab vergessen zu schreiben, dass der Typ _SI_ACCESS und alles was drumherum steht, nicht verändet werden darf. Es sind direkte Übersetzungen aus den C-Header-Dateien.
Es gibt aber eine Lösung, die das schafft. Leider ist sie etwas gefährlich.
Delphi-Quellcode:
class function GetAccessNames(out iCount : Cardinal): PSI_ACCESS;
type tASI = array of SI_ACCESS;
var
siArr : tASI;
i : Cardinal;
begin
iCount := 32;
GetMem(result, Sizeof(si) * iCount);
{hier noch kein Zugriff auf siArr !!!!!!!}
siArr := tASI(result);
{result = siArr}
for i := 0 to iCount -1 do
begin
//Zugriff : siArr[i]
end;
end;