Autor Beitrag
Matthew144
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 30.05.11 16:34 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 30.05.11 19:07 
Es gibt die WinAPI funktion Suche im MSDN SAFEARRAYCREATE, damit sollte das gehen :)

_________________
Aya
I aim for my endless dreams and I know they will come true!
Matthew144 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 31.05.11 10:04 
Hallo Aya und danke für den Tipp,
leider bin ich damit nicht so recht klargekommen. Stattdessenhabe ich einfach folgendes gemacht:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 31.05.11 10: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!