AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
Thema durchsuchen
Ansicht
Themen-Optionen

Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?

Ein Thema von berens · begonnen am 23. Jul 2020 · letzter Beitrag vom 23. Jul 2020
 
berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#1

Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?

  Alt 23. Jul 2020, 15:22
Hallo zusammen,
ich verwende eine nette Funktion die ich hier gefunden habe: https://en.it1352.com/article/72b34a...39fdf24df.html , um Texte schnell und einfach zu verschlüsseln und auch wieder zu entschlüsseln.

In meinem Beispielprojekt funktioniert alles einwandfrei, sobald ich die Funktion derselben Unit jedoch in meinem anderen Projekt verwende, kommt der folgende Fehler: [DCC Fehler] foo.pas(50): E2010 Inkompatible Typen: 'PByte' und 'Pointer'.

Warum nur in dem einen, nicht aber in dem anderen Projekt? Bei beiden Projekten habe ich alle verwendeten .pas-Datein zur Projektverwaltung hinzugefügt, damit diese auch garantiert beim compilieren neu erzeugt werden, und ich nicht versehentlich mit veralteten .dcu-Dateien arbeite.

Was mache ich falsch?

Delphi-Quellcode:
function CryptString(Const Input: string; password : System.AnsiString; Encrypt: Boolean) : string;
const
     BufferSize=1024*1024;
var
     StreamSource : TStringStream;
     StreamDest : TStringStream;
     CRYPTPROV : HCRYPTPROV;
     CRYPTHASH : HCRYPTHASH;
     CRYPTKEY : HCRYPTKEY;
     Buffer : LPBYTE;
     BytesIn : DWORD;
     Final : Boolean;

     Encoder : TIdEncoderMIME;
     Decoder : TIdDecoderMIME;
     DestStream : TStringStream;
begin
     CryptAcquireContext(CRYPTPROV, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
     try
         //create a valid key based in the password
         if not CryptCreateHash(CRYPTPROV, CALG_SHA1, 0, 0, CRYPTHASH) then RaiseLastOSError;
         try
           if not CryptHashData(CRYPTHASH, @Password[1], Length(Password), 0) then RaiseLastOSError; // FEHLER IST HIER bei @Password[1]
           if not CryptDeriveKey(CRYPTPROV, CALG_RC4, CRYPTHASH, 0, CRYPTKEY) then RaiseLastOSError;
         finally
           CryptDestroyHash(CRYPTHASH);
         end;

         StreamSource := TStringStream.Create(Input);
         StreamSource.Position:=0;
         StreamDest := TStringStream.Create;
         try
           GetMem(Buffer, BufferSize);
           try

             if not Encrypt then
             begin
               //decode the string using base64
               Decoder := TIdDecoderMIME.Create(nil);
               try
                 DestStream := TStringStream.Create;
                 try
                   StreamDest.Position:=0;
                   Decoder.DecodeBegin(DestStream);
                   Decoder.Decode(StreamSource);
                   Decoder.DecodeEnd;
                   StreamSource.Clear;
                   DestStream.Position:=0;
                   StreamSource.CopyFrom(DestStream,DestStream.Size);
                   StreamSource.Position:=0;
                 finally
                   DestStream.Free;
                 end;
               finally
                 Decoder.Free;
               end;

             end;


               repeat
                 BytesIn := StreamSource.Read(Buffer^, BufferSize);
                 Final := (StreamSource.Position >= StreamSource.Size);
                 if Encrypt then
                 begin
                  if not CryptEncrypt(CRYPTKEY, 0, Final, 0, Buffer, BytesIn, BytesIn) then RaiseLastOSError;
                 end
                 else
                 if not CryptDecrypt(CRYPTKEY, 0, Final, 0, Buffer, BytesIn) then RaiseLastOSError;

                 StreamDest.Write(Buffer^, BytesIn);
               until Final;


             //encode the string using base64
             if Encrypt then
             begin
               Encoder := TIdEncoderMIME.Create(nil);
               try
                 DestStream:=TStringStream.Create;
                 try
                   StreamDest.Position:=0;
                   Encoder.Encode(StreamDest,DestStream);
                   Result := DestStream.DataString;
                 finally
                   DestStream.Free;
                 end;
               finally
                 Encoder.Free;
               end;
             end
             else
             Result:= StreamDest.DataString;


           finally
            FreeMem(Buffer, BufferSize);
           end;

         finally
           StreamSource.Free;
           StreamDest.Free;
         end;
     finally
       CryptReleaseContext(CRYPTPROV, 0);
     end;
end;
Die Funktion CryptHashData steht in der JwaWinCrypt von JEDI API 2.3 and JEDI WSCL 0.9.3
Delphi-Quellcode:
function CryptHashData(hHash: HCRYPTHASH; pbData: LPBYTE; dwDataLen, dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM CryptHashData}

...

function CryptHashData; external advapi32 name 'CryptHashData';
Edit 1:
Mit der geänderten Zeile scheint das zu funktionieren. Ist das Sachlich richtig?
           if not JwaWinCrypt.CryptHashData(CRYPTHASH, pbyte(Password), Length(Password), 0) then RaiseLastOSError;
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (23. Jul 2020 um 15:29 Uhr)
  Mit Zitat antworten Zitat
 


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 14:38 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-2025 by Thomas Breitkreuz