AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TBitmap von zwei Programmen austauschen (Speicher zuweisen)
Thema durchsuchen
Ansicht
Themen-Optionen

TBitmap von zwei Programmen austauschen (Speicher zuweisen)

Ein Thema von Cyberstorm · begonnen am 16. Mär 2008 · letzter Beitrag vom 16. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#1

TBitmap von zwei Programmen austauschen (Speicher zuweisen)

  Alt 16. Mär 2008, 12:28
Hallo.

Ich möchte ein Speicherresistentes TBitmap von einem Programm in einem anderen verwenden.
Ich hoffe doch, dass dies irgendwie möglich ist?!

Im Endeffekt möchte ich dem "neuen" TBitmap den selben Speicher zuweisen wie dem "originalem" also

bmp1:=bmp2;

aber halt programmübergreifend.


ps: wie ich Daten (z.b. eine Speicheradresse) zwischen den Programmen austauschen kann weiß ich.


Vielen Dank für Hilfe!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 13:19
Schreib lieber wozu du das brauchst, also was du eigentlich erreichen willst. So klappt dies nicht, da das Bitmap im jeweils anderen Adressraum liegt und auch die Klassen-Typen nicht gleich wären. Von daher erläutere mal lieber was du eigentlich willst. Wahrscheinlich musste über das Handle gehen.
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#3

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 13:43
Programm A bekommt Bilder (TBitmap) von einer WebCam.
Programm B lässt eine Art Gesichtserkennung über eine dll drüber laufen.

Die dll exportiert eine Funktion, über die ein Bild per Bitmap Handle geladen wird:
"LoadImageFromHBitmap(BitmapHandle: HBitmap)"

Die dll ist nicht von mir und hat Speicherlecks + produziert nach einigen Aufrüfen hier und da frühlige Zugriffsverletzungen.
Da ein dynamischen einbinden (mit LoadLibrary, FreeLibrary) Probleme gemacht hat (FreeLibrary hing immer so ca. 5Sekunden) sah ich mich gezwungen den Teil mit der dll in eine kleine Konsolenanwendung auszulagern, die dann vom Hauptprogramm mit Parametern aufgerufen wird.

Da die ganze Geschichte relativ zeitkritisch ist, wollte ich mir die Zeit sparen, das Bitmap auf die Festplatte zu speichern und anschließend wieder zu laden, da ich es ja eh schon im Speicher habe.
Da es von der WebCam kommt ist es ja auch erstmal nicht auf der Platte...

Kann ich nicht das Bitmap über SaveToStream per MemoryStream oder so als MemoryMappedFile im Speicher sichern und dann in dem anderen Prog wieder laden?

Am liebsten wäre mir natürlich, wenn ich die Daten direkt über Assign oder so zuweisen könnte.
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#4

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 17:17
Also ich habe es jetzt folgendermaßen leider erfolglos probiert ein Bitmap über ein Memory Mapped File auszutauschen.
Leider kommen in dem Stream nur Nullen an
Findet jemand einen Fehler?


Sender:

Delphi-Quellcode:
const
 mmfName = 'FaceBitmapData';

procedure WriteToMMF(m: TMemoryStream; Filename: string);
var
  hFileMapping: THandle;
  Mem: Pointer;
begin
  hFileMapping:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, m.Size, PChar(Filename));
  if hFileMapping <> 0 then
    begin
      Mem:=MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
      if Assigned(Mem) then
        begin
          CopyMemory(Mem, m.Memory, m.Size);
          CloseHandle(hFileMapping);
        end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  bmp: TBitmap;
  mStream: TMemoryStream;
begin
  bmp:=TBitmap.Create;
  mStream:=TMemoryStream.Create;
    try
      bmp.LoadFromFile('c:\t.bmp');
      bmp.SaveToStream(mStream);
      WriteToMMF(mStream, mmfName);
      ExecuteFile(ExtractFilePath(ParamStr(0)) + 'ReadKonsole.exe', mmfName + ' ' + IntToStr(mStream.Size), '', false, true);
    finally
      FreeAndNil(bmp);
      FreeAndNil(mStream);
    end;
end;

Empfänger (KonsolenApp):
Delphi-Quellcode:
var
  Bmp: TBitmap;
  OldRegVal: String;
  inSize: Integer;
  hFileMapping: THandle;
  Mem: Pointer;
  m: TMemoryStream;
begin
  Bmp:=TBitmap.Create;
  m:=TMemoryStream.Create;
    try
      inSize:=StrToInt(ParamStr(2));
      hFileMapping:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READONLY, 0, inSize, PChar(ParamStr(1)));
      if hFileMapping <> 0 then
        begin
          Mem:=MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
          if Assigned(Mem) then
            begin
              m.SetSize(inSize);
              m.Seek(0, soFromBeginning); //unnötig?!
              CopyMemory(m.Memory, Mem, inSize);
              m.SaveToFile('c:\stream.dat');
              Bmp.LoadFromStream(m);
              Bmp.SaveToFile('c:\out.bmp');
            end;
          CloseHandle(hFileMapping);
        end;
    finally
      FreeAndNil(Bmp);
      FreeAndNil(m);
    end;

Danke schonma!
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#5

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 17:45
Argh hab meinen Fehler.

Ist schon schlau, wenn man das Handle wieder schließt, bevor man die daten ausliest...

"CloseHandle(hFileMapping);" muss beim sender natürlich raus...
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 19:08
Aber mal was anderes: Wenn deine App TBitmap von der WebCAM bekommt und die DLL (die ja nun von der Console App angezogen wird) ein HBITMAP Handle haben will, dann verschicke doch einfach nur das? Diese 4 Bytes sind doch einfach zwischen den Prozessen verschickbar, da Windows die Bitmapdaten hat und das Handle eindeutig ist. Warum soviel Aufwand die Bilddaten auf den anderen Prozess zu schieben, wenn Windows diese doch hat und die DLL diese noch nicht mal will sondern die auch nur über das Handle von Windows holt?
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#7

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 19:11
Das war natürlich mein erster Versuch.

Klappt aber nicht.
Gibt ne Zugriffsverletzung.
Ich denke mal, dass es daran liegt, dass das Handle auf den (geschützten) Speicherbereich des anderen Programms zeigt.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 19:20
Zitat von Cyberstorm:
Das war natürlich mein erster Versuch.

Klappt aber nicht.
Gibt ne Zugriffsverletzung.
Ich denke mal, dass es daran liegt, dass das Handle auf den (geschützten) Speicherbereich des anderen Programms zeigt.
Das Handle ist nur eine eindeutige "Zahl" die von Windows vergeben wird beim anlegen des Bitmaps und einfach nur ein eindeutiges Objekt angibt. Es kann definitiv keine AV auslösen, wenn das Handle nicht gültig ist. Die AV muss an was anderem gelegen haben.
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#9

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 19:28
Ja, aber die Zugriffsverletzung kommt, wenn die dll probiert Daten von dem Handle zu lesen und merkt, dass da nichts kommt .

Probier es doch aus wenn du mir nicht glaubst:

Programm1: Bitmap Laden + Handle ausgeben (editfeld oder whatever);
Programm2: Bitmap erzeugen, Handel zuweisen, Bitmap speichern.

wird ein leeres Bitmap bei rauskommen.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: TBitmap von zwei Programmen austauschen (Speicher zuweis

  Alt 16. Mär 2008, 19:31
Kann ich bestätigen, hatte ich auch schon mal ausprobiert.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:30 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