AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Nach CopyMemory werden Daten nicht übernommen
Thema durchsuchen
Ansicht
Themen-Optionen

Nach CopyMemory werden Daten nicht übernommen

Ein Thema von EWeiss · begonnen am 5. Jan 2014 · letzter Beitrag vom 7. Jan 2014
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.379 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 5. Jan 2014, 21:48
Wie sieht es denn aktuell aus, wenn du schreibst du hast es geändert?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 5. Jan 2014, 21:53
Wie sieht es denn aktuell aus, wenn du schreibst du hast es geändert?
Delphi-Quellcode:
    GetObject(Background.Handle, SizeOf(Bmp), @Bmp);

    size := Bmp.bmWidth * Bmp.bmHeight * Bmp.bmBitsPixel;
    PpixelDataArr := SafeArrayCreateVector(VT_UI1, 0, size);

    PpixelDataArr.cDims := 2;
    PpixelDataArr.cbElements := 1;
    PpixelDataArr.fFeatures := 0;
    PpixelDataArr.cLocks := 0;
    PpixelDataArr.pvData := Bmp.bmBits;
    PpixelDataArr.rgsabound[0].lLbound := 0;
    PpixelDataArr.rgsabound[0].cElements := Bmp.bmWidth;
Hab das Temporäre gelöscht dann kann mir das casten sparen..
Aber funktioniert trotzdem nicht.. Ich vermisse das PixelArray innerhalb des SafeArray
Versteh die Technik wohl nicht die dahinter steckt.


gruss

Geändert von EWeiss ( 5. Jan 2014 um 21:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.379 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 5. Jan 2014, 22:16
Da du schreibst, dass es in Delphi nicht so viele Informationen dazu gibt:
Das liegt daran, dass du direkt mit der API arbeitest. Delphi selbst hat Funktionen wie VarArrayCreate um mit solchen Arrays zu arbeiten.
Ein wenig Material dazu findest du hier:
http://www.gekko-software.nl/Delphi/index.htm

Und hier noch ein Beispiel zu der API selbst in Delphi (erste Antwort):
https://forums.embarcadero.com/threa...threadID=53288
Bei dir fehlt jetzt das Kopieren der Daten würde ich mal sagen. Du musst nur die richtige Anzahl Bytes kopieren.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 5. Jan 2014, 22:19
Ohne die SaveArrays jetzt wirklich zu kennen: Wie ich das sehe, reicht es nicht einfach per PpixelDataArr.pvData := Bmp.bmBits die Daten zuweisen zu wollen. Ich würde hier MSDN-Library durchsuchenSafeArrayAccessData verwenden, um mir einen Zeiger auf die tatsächlichen Daten zu holen. Danach sollte ein CopyMemory(PtrFromAccessDataAPI, Bmp.bmBits, size) ausreichen, um die Daten zu kopieren. Abschließend aber MSDN-Library durchsuchenSafeArrayUnaccessData nicht vergessen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 5. Jan 2014, 22:55
Ohne die SaveArrays jetzt wirklich zu kennen: Wie ich das sehe, reicht es nicht einfach per PpixelDataArr.pvData := Bmp.bmBits die Daten zuweisen zu wollen. Ich würde hier MSDN-Library durchsuchenSafeArrayAccessData verwenden, um mir einen Zeiger auf die tatsächlichen Daten zu holen. Danach sollte ein CopyMemory(PtrFromAccessDataAPI, Bmp.bmBits, size) ausreichen, um die Daten zu kopieren. Abschließend aber MSDN-Library durchsuchenSafeArrayUnaccessData nicht vergessen.
Funktioniert leider nicht..
Danke..

Ich habe schon das Problem mit dem Header der kommt auch schon nicht an.

Delphi-Quellcode:
var
  BitmapInfo : Pointer;
.....
BitmapStream.Position := 0;
Background.LoadFromStream(BitmapStream);

BitmapStream.Position := 0;
BitmapInfo := @BitmapInfoHeader;
SafeArrayAccessData(PbitmapInfoArr, BitmapInfo);
SafeArrayUnaccessData(PbitmapInfoArr);
Danach sende ich die Daten das Resultat siehe Anhang..
Na egal dauert halt seine zeit bis ich weis wie es funktioniert.

ops.. der falsche punkt im Anhang aber spielt keine rolle ist überall 0

gruss

Geändert von EWeiss (11. Jul 2019 um 15:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 6. Jan 2014, 00:01
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 6. Jan 2014, 00:17
Danke du bist wirklich hilfsbereit.. ohne den unnötigen Schnick,schnack Drumherum

Ich hatte die Funktion ja schon geschrieben
Delphi-Quellcode:
var
   size: Integer;
   header: BITMAPINFOHEADER;
   pHeader: Pointer;

begin
   if Assigned(PpixelDataArr) then
     SafeArrayDestroy(PpixelDataArr);

   if Assigned(PbitmapInfoArr) then
     SafeArrayDestroy(PbitmapInfoArr);

     size := width * height * bytePerPixel;
     PpixelDataArr := SafeArrayCreateVector(VT_UI1, 0, size);

     PbitmapInfoArr := SafeArrayCreateVector(VT_UI1, 0, sizeof(BITMAPINFOHEADER));

     pHeader := @Header;

     SafeArrayAccessData(PbitmapInfoArr, pHeader);
     Header.biSize := sizeof(BITMAPINFOHEADER);
     Header.biWidth := width;
     Header.biHeight := height;
     Header.biBitCount := bytePerPixel*8;
     Header.biCompression := FourCC;
     SafeArrayUnaccessData(PbitmapInfoArr);
Was sich nicht vertragen hat war diese Umsetzung auf die mir niemand geantwortet hat als ich danach fragte.
Nun habe ich diese Verändert da die Konvertierung "pHeader := @Header" tatsächlich nicht funktioniert hat.
Jetzt kommen die Daten auch richtig an. Zumindest was den Header betrifft mit dem anderen muss ich noch schaun.

Delphi-Quellcode:
procedure TAtmoCtrlLib.AtmoCreateTransferBuffers(header: PBITMAPINFOHEADER; FourCC, bytePerPixel, width,
  height: Integer);
var
  size: Integer;

begin
  if Assigned(PpixelDataArr) then
    SafeArrayDestroy(PpixelDataArr);

  if Assigned(PbitmapInfoArr) then
    SafeArrayDestroy(PbitmapInfoArr);

    size := width * height * bytePerPixel;
    PpixelDataArr := SafeArrayCreateVector(VT_UI1, 0, size);

    PbitmapInfoArr := SafeArrayCreateVector(VT_UI1, 0, sizeof(BITMAPINFOHEADER));

    SafeArrayAccessData(PbitmapInfoArr, Pointer(Header));
    Header.biSize := sizeof(BITMAPINFOHEADER);
    Header.biWidth := width;
    Header.biHeight := height;
    Header.biBitCount := bytePerPixel*8;
    Header.biCompression := FourCC;
    SafeArrayUnaccessData(PbitmapInfoArr);
end;
AtmoCtrlLib.AtmoCreateTransferBuffers(@BitmapInfoHeader, BI_RGB, 4, 64, 48);

Wie gesagt ich muss den Kram alles selber machen da gibt es nichts vergleichbares.
War wohl nur für C++ C# gedacht!

EDIT:
Eigentlich müssten doch die Pixel inklusive der Farben in Bmp.bmBits vorhanden sein oder?
Hmm wenn nicht muss ich diese wohl noch zu psa.rgsabound[0] hinzufügen sehe ich das richtig?

Das will irgendwie nicht mit den PixelArray
Im Moment fällt mir nichts mehr ein.

gruss und Danke..

Geändert von EWeiss (11. Jul 2019 um 15:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 6. Jan 2014, 09:09
Kannst du mal den Code zeigen, den du für das Kopieren der Pixeldaten verwendest? Eigentlich sollte das ja analog zum Header funktionieren.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz