Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Daten nach einem Pointer in einen String kopieren (https://www.delphipraxis.net/43214-daten-nach-einem-pointer-einen-string-kopieren.html)

Amalkotey 30. Mär 2005 20:55


Daten nach einem Pointer in einen String kopieren
 
Hallo DPler,

ich beschäftige mich z. Zt. mit der Entwicklung eines Programmes, welches unsere Mitarbeiter verwaltet und in eine FreeBase-Datenbank (FreeBase-Komponente von Rainer Reusch & Toolbox-Verlag) speichert. Neben den einzelnen String-Daten soll auch ein Passbild des Mitarbeiters gespeichert werden. Die Speicherung erfolgt in dem Record "TBinaryParams".

Delphi-Quellcode:
  TBinaryParams = Record
    DataSize: LongInt;
    Data   : Pointer;
  End;
Damit wir mit dem Bild auch arbeiten können, ist es notwendig, die Bilddaten in eine String-Variable zu kopieren. Irgendwie schein das nicht zu funktionieren. Wie kann ich einer String-Variable die Daten zuweisen bzw. die Adresse auf die Adresse des Pointers setzen? Danke für eure Hilfe im voraus.

Mit bestem Gruss
Amalkotey

Christian Seehase 30. Mär 2005 21:16

Re: Daten nach einem Pointer in einen String kopieren
 
Moin Amalkotey,

in welcher Form liegen denn die Bilddaten vor?
Um Speicherbereiche zu kopieren kannst Du, z.B., MSDN-Library durchsuchenCopyMemory verwenden.

Amalkotey 30. Mär 2005 21:39

Re: Daten nach einem Pointer in einen String kopieren
 
Zitat:

Zitat von Christian Seehase
MSDN-Library durchsuchenCopyMemory verwenden.

Hallo Christian,

die Bilddaten liegen im JPG-Format vor. die CopyMemory-Procedure

Delphi-Quellcode:
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
kann ich nicht verwenden, da diese als Ziel wieder einen Pointer wünscht. Mein Problem ist es, das ich nicht weiß, ich die Speicher-Adresse des Strings ermitteln und setzen kann.

Gruss
Amalkotey

Christian Seehase 30. Mär 2005 22:04

Re: Daten nach einem Pointer in einen String kopieren
 
Moin Amalkotey,

ich verstehe jetzt nicht, wozu Du die Adresse des Strings setzen willst :gruebel:

Zugreifen kannst Du mit:

@StringVariable[1]

Falls Du die Adresse setzen willst, um den Wert wieder auszulesen:

Nimm eine Stringvariable, und setze deren Länge auf die erforderliche Grösse (SetLength oder StringOfChar).
Anschliessend kannst Du dann auf oben genanntem Wege die Adresse des ersten Zeichens ermitteln, und den String füllen.

Mal ein Beispiel:

Delphi-Quellcode:
var
  sSource : string;
  sDest  : string;
  dwSize : DWORD;

begin
  dwSize := 10;
  sSource := StringOfChar('A',dwSize);
  SetLength(sDest,dwSize);
  CopyMemory(@sDest[1],@sSource[1],dwSize);
  ShowMessage(sDest);
end;

Amalkotey 30. Mär 2005 23:50

Re: Daten nach einem Pointer in einen String kopieren
 
Hallo Christian,

danke für Deine Hilfe. Ich habe Dein Beipiel angepaßt und es funktioniert. Folgendes ist dabei entstanden:

Delphi-Quellcode:
  Function SetBinaryCipher(Modus: Integer; Argument: Pointer; DataSize: Integer; pwKey: String): Pointer;
  Var
    Buffer: String;

  Begin
    SetLength(Buffer, DataSize);
    CopyMemory(@Buffer[1], Argument, DataSize);
    With TCipher_Blowfish.Create(pwKey, NIL) Do Begin
      Try
        Mode := TCipherMode(0);
        Case Modus Of
          FBDecode: Buffer := CodeString(Buffer, paDecode, 1); // Entschlüsseln
          FBEncode: Buffer := CodeString(Buffer, paEncode, 1); // Verschlüsseln
        End;
      Finally
        Free;
      End;
    End;
    CopyMemory(Argument, @Buffer[1], DataSize);
    Result := Argument;
  End;
Da auch Gehaltsabrechnungen und sonstige Dokumente in der FreeBase-Datenbank gespeichert werden, ist die Vorgabe, dass die Daten verschlüsselt werden sollen. Da es jetzt bei den Mitarbeiter-Fotos korrekt funktioniert, kann ich die Funktion auch für die Dokumenten-Verschlüsselung verwenden. Nochmals Danke, und eine angenehme Nachtruhe.

Gruss
Amalkotey


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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