AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Effizientes Einlesen und Verarbeiten von Textdatei
Thema durchsuchen
Ansicht
Themen-Optionen

Effizientes Einlesen und Verarbeiten von Textdatei

Ein Thema von Dalai · begonnen am 30. Jun 2022 · letzter Beitrag vom 4. Jul 2022
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Effizientes Einlesen und Verarbeiten von Textdatei

  Alt 1. Jul 2022, 11:03
Zitat:
Der Zwischenschritt über TBytes (= array of Byte) ist meiner Meinung nach unnötig. Irgendwie bin ich aber zu blöd, direkt auf Lblob.pbData den Speicher zu reservieren, die Bytes des Strings mit Move dorthin zu kopieren, und anschließend den Speicher mit FreeMem wieder freizugeben, ohne dass es knallt (siehe auskommentierter Teil). Ja, ich weiß, dass Move die Adresse des Zielspeichers ändert und es deshalb knallt. Wie kann ich denn sonst die Bytes des Strings dorthin übertragen?
Falls es dir irgendwie eine Hilfe ist, aber in der HTTP-Request-Klasse der höheren Delphi-Versionen in der Unit System.Net.HttpClient.Win wird auch mit einem Stream (FClientCertificate) der Umweg über ein dynamisches TBytes-Array gegangen.

Delphi-Quellcode:
procedure TWinHTTPRequest.SetWinCertificate;
var
  LStore: HCERTSTORE;
  LCertContext: PCCERT_CONTEXT;
  LBlob: CRYPT_DATA_BLOB;
  LBytes: TBytes;
begin
  if (FClientCertPath = '') and (FClientCertificate = nil) then
    Exit;

  if FClientCertPath <> 'then
    LStore := CertOpenStore(PAnsiChar(CERT_STORE_PROV_FILENAME), X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
      0, CERT_STORE_OPEN_EXISTING_FLAG or CERT_STORE_READONLY_FLAG, PChar(FClientCertPath))
  else
  begin
    LBlob.cbData := FClientCertificate.Size; // <--- siehe von hier...
    SetLength(LBytes, LBlob.cbData);
    FClientCertificate.Position := 0;
    FClientCertificate.Read(LBytes, LBlob.cbData);
    LBlob.pbData := PByte(@LBytes[0]); // <--- ...bis hier!
    LStore := PFXImportCertStore(@LBlob, PChar(FClientCertPassword), 0);
  end;
  if LStore = nil then
    raise ENetHTTPRequestException.CreateResFmt(@SNetHttpCertFileOpenError,
      [GetLastError, SysErrorMessage(GetLastError, TWinHttpLib.Handle)]);
  try
    LCertContext := CertFindCertificateInStore(LStore, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
      0, CERT_FIND_ANY, nil, nil);
    if LCertContext = nil then
      raise ENetHTTPRequestException.CreateResFmt(@SNetHttpCertNotFoundError,
        [GetLastError, SysErrorMessage(GetLastError, TWinHttpLib.Handle)]);
    try
      WinHttpSetOption(FWRequest, WINHTTP_OPTION_CLIENT_CERT_CONTEXT,
        LCertContext, SizeOf(CERT_CONTEXT));
    finally
      CertFreeCertificateContext(LCertContext);
    end;
  finally
    CertCloseStore(LStore, 0);
  end;
end;
Delphi-Quellcode:
// mit der Definition aus Winapi.Windows
type
  _CRYPTOAPI_BLOB = record
    cbData: DWORD;
    pbData: PBYTE;
  end;
...
CRYPT_DATA_BLOB = _CRYPTOAPI_BLOB;
  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 11:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz