Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CopyPTRtoBYTES alternative in Delphi (https://www.delphipraxis.net/132956-copyptrtobytes-alternative-delphi.html)

EWeiss 22. Apr 2009 18:55


CopyPTRtoBYTES alternative in Delphi
 
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.dll' Name 'RtlMoveMemory';

procedure CopyPTRtoBYTES(ByteDest: Byte; PtrSrc: Pointer; Length: Integer); stdcall;
    external 'kernel32.dll' Name '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

Assertor 22. Apr 2009 19:48

Re: CopyPTRtoBYTES alternative in Delphi
 
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

Muetze1 22. Apr 2009 19:56

Re: CopyPTRtoBYTES alternative in Delphi
 
Die oben referenzierte Methode wird als CopyMemory() angeboten.

Assertor 22. Apr 2009 20:07

Re: CopyPTRtoBYTES alternative in Delphi
 
Hi,

Zitat:

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

EWeiss 22. Apr 2009 20:35

Re: CopyPTRtoBYTES alternative in Delphi
 
Zitat:

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.
Delphi-Quellcode:
CopyPTRtoBYTES(ia[0, 0], pAddr, 49152);
hmmm.... :wall:

gruss Emil

Assertor 22. Apr 2009 20:51

Re: CopyPTRtoBYTES alternative in Delphi
 
Hi,

Zitat:

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

EWeiss 22. Apr 2009 21:25

Re: CopyPTRtoBYTES alternative in Delphi
 
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

EWeiss 23. Apr 2009 19:29

Re: CopyPTRtoBYTES alternative in Delphi
 
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

Blup 24. Apr 2009 08:33

Re: CopyPTRtoBYTES alternative in Delphi
 
Delphi-Quellcode:
 
SelectObject(hTempDc, hDibSecOld);
DeleteObject(hDibSec);
DeleteDC(hTempDc);

EWeiss 24. Apr 2009 09:07

Re: CopyPTRtoBYTES alternative in Delphi
 
Zitat:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.
Seite 1 von 2  1 2      

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