Du schreibst den Header ja auch nirgendwo in das Array rein
Probiers mal so:
Delphi-Quellcode:
var
BitmapInfo: TBitmapInfoHeader;
Data: Pointer;
{ ... }
SafeArrayAccessData(PbitmapInfoArr, Data);
CopyMemory(Data, @BitmapInfo, SizeOf(BitmapInfo));
SafeArrayUnaccessData(PbitmapInfoArr);
Die SafeArrayAccessData liefert dir als Output Parameter einen komplett neuen Pointer. Du weißt zwar vor dem Aufruf
BitmapInfo := @BitmapInfoHeader
zu, aber nach dem Aufruf von SafeArrayAccessData, wurde der Zeiger bereits wieder überschrieben.