AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CopyPTRtoBYTES alternative in Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

CopyPTRtoBYTES alternative in Delphi

Ein Thema von EWeiss · begonnen am 22. Apr 2009 · letzter Beitrag vom 24. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 18:55
Welche alternative bietet sich hier an ?

Code:
Private Declare Sub CopyBYTEStoPTR Lib "kernel32.dll" Alias "RtlMoveMemory" _
                          (ByVal PtrDest As Long, _
                          ByRef ByteSrc As Byte, _
                          ByVal Length As Long)

Private Declare Sub CopyPTRtoBYTES Lib "kernel32.dll" Alias "RtlMoveMemory" _
                          (ByRef ByteDest As Byte, _
                          ByVal PtrSrc As Long, _
                          ByVal Length As Long)
Meine Delphi version!

Delphi-Quellcode:
procedure CopyBYTEStoPTR(PtrDest: Pointer; ByteSrc: Byte; Length: Integer); stdcall;
    external 'kernel32.dllName 'RtlMoveMemory';

procedure CopyPTRtoBYTES(ByteDest: Byte; PtrSrc: Pointer; Length: Integer); stdcall;
    external 'kernel32.dllName 'RtlMoveMemory';
und die beiden aufrufe.
Code:
    //' Copy The R,G,B Data Into Our Image Array For Rapid Editing/Fading.
    CopyPTRtoBYTES(ia[0, 0], pAddr, 49152);

    //' Copy Edited Image Back To Dib Section.
    CopyBYTEStoPTR(pAddr, ia[0, 0], 49152);
Denke das müßte in Delphi eleganter zu lösen sein.

gruss Emil
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#2

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 19:48
Hi Emil,

ich würd das direkt über die Move() machen. Schau mal in die Hilfe zu Move(), u.U. sind da einige Beispiele drin. Ansonsten poste einfach wieder hier, wenns irgendwo hakt.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 19:56
Die oben referenzierte Methode wird als CopyMemory() angeboten.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 20:07
Hi,

Zitat von Muetze1:
Die oben referenzierte Methode wird als CopyMemory() angeboten.
CopyMemory() ist aber auch nur ein Wrapper in der Windows.pas für Move()

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 20:35
Zitat von Assertor:
Hi Emil,

ich würd das direkt über die Move() machen. Schau mal in die Hilfe zu Move(), u.U. sind da einige Beispiele drin. Ansonsten poste einfach wieder hier, wenns irgendwo hakt.

Gruß Assertor
Danke werde es mal testen..
Habe schon ein problem das der Pointer immer nil bleibt.

Eigentlich sollte hier
Delphi-Quellcode:
procedure MonitorAudio;
var
 hDibSec : Cardinal;
 hDibSecOld : Cardinal;
 BIH : BITMAPINFO;
 
begin
    With BIH do
    begin
        BIH.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER);
        BIH.bmiHeader.biBitCount := 24;
        BIH.bmiHeader.biWidth := 256;
        BIH.bmiHeader.biHeight := -64; //' Top Down DIB.
        BIH.bmiHeader.biPlanes := 1;
        BIH.bmiHeader.biSize := 40;
        BIH.bmiHeader.biSizeImage := 49152;
    end;
    hTempDc := CreateCompatibleDC(0);
    hDibSec := CreateDIBSection(hTempDc, BIH, 0, pAddr, 0, 0);
    hDibSecOld := SelectObject(hTempDc, hDibSec);
        
    DrawData;

    DeleteObject(SelectObject(hTempDc, hDibSecOld));
    DeleteDC(hTempDc);

end;
pAddr gefüllt werden .. bleibt aber nil.
Somit wäre die funktion erstmal ohne resultat.
CopyPTRtoBYTES(ia[0, 0], pAddr, 49152); hmmm....

gruss Emil
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 20:51
Hi,

Zitat von EWeiss:
Delphi-Quellcode:
procedure MonitorAudio;
var
 hDibSec : Cardinal;
 hDibSecOld : Cardinal;
 BIH : BITMAPINFO;
 
begin
    ZeroMemory(@bih, sizeof(BITMAPINFO)); // gewohnheit...
    With BIH do
    begin
        BIH.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER);
        BIH.bmiHeader.biBitCount := 24;
        BIH.bmiHeader.biWidth := 256;
        BIH.bmiHeader.biHeight := -64; //' Top Down DIB.
        BIH.bmiHeader.biPlanes := 1;
        BIH.bmiHeader.biSize := 40; // was soll das hier?
        BIH.bmiHeader.biSizeImage := 49152;
    end;
    ...
end;
Du setzt die Größe der Headerinfo erst auf die korrekte Größe SizeOf(BitmapInfoHeader) dann nachträglich fest auf 40 - warum?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 22. Apr 2009, 21:25
Zitat:
Du setzt die Größe der Headerinfo erst auf die korrekte Größe SizeOf(BitmapInfoHeader) dann nachträglich fest auf 40 - warum?
ups..
Ja das ist natürlich quatsch.
Habe es vergessen zu entfernen.

Danke für die Info.

gruss Emil
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 23. Apr 2009, 19:29
Zitat:
ZeroMemory(@bih, sizeof(BITMAPINFO)); // gewohnheit...
Schaufelt bei mir bei jeden durchlauf 4 MB in den Speicher.
Ohne sind es ein paar K warum versteh ich wieder mal nicht gebe alles frei.

Delphi-Quellcode:
procedure TfrmMain.MonitorAudio;
var
 hDibSec : HBITMAP;
 BIH : BITMAPINFO;
 hDibSecOld : HBITMAP;

begin
    ZeroMemory(@bih, sizeof(BITMAPINFO));
    With BIH do
    begin
        BIH.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER);
        BIH.bmiHeader.biBitCount := 24;
        BIH.bmiHeader.biWidth := 256;
        BIH.bmiHeader.biHeight := -64; //' Top Down DIB.
        BIH.bmiHeader.biPlanes := 1;
        BIH.bmiHeader.biSizeImage := 49152;
    end;
    hTempDc := CreateCompatibleDC(0);
    hDibSec := CreateDIBSection(hTempDc, BIH, 0, pAddr, 0, 0);
    hDibSecOld := SelectObject(hTempDc, hDibSec);

    DrawData;

    SelectObject(hTempDc, hDibSecOld);
    DeleteObject(hDibSecOld);
    DeleteDC(hTempDc);

end;
kann jemand sehn ob da irgendwas nicht freigegeben wird ?

gruss EMil
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 24. Apr 2009, 08:33
Delphi-Quellcode:
 
SelectObject(hTempDc, hDibSecOld);
DeleteObject(hDibSec);
DeleteDC(hTempDc);
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: CopyPTRtoBYTES alternative in Delphi

  Alt 24. Apr 2009, 09:07
Zitat von Blup:
Delphi-Quellcode:
 
SelectObject(hTempDc, hDibSecOld);
DeleteObject(hDibSec);
DeleteDC(hTempDc);
Nö .. genau dann werden mir 4 MB in den Speicher geschaufelt
Frag mich nicht warum aber das ist so.

Meine Schreibweise ist schon korrekt.
Das Problem lag daran das ich das DC .. vom Panel nicht freigegeben habe

Erstelltes DC
DC := GetDC(frmDraw.PicBB.Handle); Und freigegeben !
Delphi-Quellcode:
DeleteObject(SelectObject(hTempDc, hDibSecOld));
DeleteDC(hTempDc);
DeleteDC(DC);
gruss Emil
  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 13:01 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