Registriert seit: 3. Sep 2004
434 Beiträge
Delphi 10.4 Sydney
|
Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
23. Jul 2020, 16: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 16:29 Uhr)
|