Entwickler-Ecke

Sonstiges (Delphi) - ByteArray in SafeArray kopieren


Matthew144 - Mo 30.05.11 15:34
Titel: ByteArray in SafeArray kopieren
Hallo,
ich habe folgendes Problem: ich habe ein Bild in meinem Speicher (Typ: PByte). Jetzt will ich dieses Bild an eine ActiveX Komponente übergeben. Diese benötigt dafür eine variable vom Typ "OleVariant". Wenn ich einfach nur den Pointer caste, dann kommt so eine Meldung wie: "Error, Input variant have no valid safe array data". Ich muss mein Bild offenbar irgendwie in so eine SafeArray Struktur rüberkopieren. Kann mir einer ein Beispiel geben, wie man so was macht? Bin im Internet leider nicht fündig geworden.

Danke!
Matthias


Aya - Mo 30.05.11 18:07

Es gibt die WinAPI funktion Suche im MSDN SAFEARRAYCREATE, damit sollte das gehen :)


Matthew144 - Di 31.05.11 09:04

Hallo Aya und danke für den Tipp,
leider bin ich damit nicht so recht klargekommen. Stattdessenhabe ich einfach folgendes gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  MyArray: OleVariant;
....

begin
...
  MyArray := VarArrayCreate([0,OleImageWidth*OleImageHeight-1], varByte);
  for I := 0 to OleImageHeight*OleImageWidth - 1 do
  begin
    MyArray[i] := PByte(Integer(OleImageDataPointer))^;
    Inc(OleImageDataPointer);
  end;


Es funktioniert, aber wie man sich denken kann ist es durch die For-Schleife bei größeren Bildern extrem stark ausgebremst. Ein einfaches "MemCpy" habe ich aber irgendwie nicht hingekriegt.
Weiß jemand einen Rat?

Danke!

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


Matthew144 - Di 31.05.11 09:58

Hallo,
hab irgendwo im Netz eine Lösung gefunden. Es sieht ungefähr so aus:

PMyTarget := VarArrayLock(MyArray);
try
move(PByte(Integer(OleImageDataPointer))^, PMyTarget^, OleImageWidth*OleImageHeight);
finally
VarArrayUnlock(MyArray);
end;


Und es funktioniert!