Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
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:
Die Funktion CryptHashData steht in der JwaWinCrypt von JEDI API 2.3 and JEDI WSCL 0.9.3
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;
Delphi-Quellcode:
Edit 1:
function CryptHashData(hHash: HCRYPTHASH; pbData: LPBYTE; dwDataLen, dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM CryptHashData} ... function CryptHashData; external advapi32 name 'CryptHashData'; Mit der geänderten Zeile scheint das zu funktionieren. Ist das Sachlich richtig?
Delphi-Quellcode:
if not JwaWinCrypt.CryptHashData(CRYPTHASH, pbyte(Password), Length(Password), 0) then RaiseLastOSError;
|
AW: Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
1. Ist LPBYTE in beiden Projekten gleich definiert (Strg+Linksklick)
2. Sind die JEDI-Versionen in den beiden Projekten gleich. 3. Nach Alternativen umsehen, CryptHashData ist veraltet und könnte in Zukunft entfernt werden. Siehe MSDN. |
AW: Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
> Ist LPBYTE in beiden Projekten gleich definiert (Strg+Linksklick)
Delphi-Quellcode:
Tatsächlich kann der von der Funktion verwendete Parameter unterschiedlichen Typs sein.
PBYTE = {$IFDEF USE_DELPHI_TYPES} Windows.PBYTE {$ELSE} ^Byte {$ENDIF};
{$EXTERNALSYM PBYTE} Ich habe jetzt (mit der Originalversion) mal in mein Programm und die betroffene Unit selbst {$DEFINE USE_DELPHI_TYPES} geschrieben, leider ändert das nichts: In dem einen Programm geht's, in dem anderen nicht... Wäre denn meine (siehe Edit 1. Beitrag) Lösung mit dem pbyte(Password) korrekt, oder ein böses No-Go? > Sind die JEDI-Versionen in den beiden Projekten gleich. Ja, beide Programme greifen auf die selben Bibliothekspfade zu, und die betroffene Unit ist namentlich sogar direkt in beide Projekte einbunden. > 3. Nach Alternativen umsehen, CryptHashData ist veraltet und könnte in Zukunft entfernt werden. Siehe MSDN. Zur Verschlüsselung habe ich schon viele Themen gelesen, aber entweder verweisen die auf veraltete/verwaiste Seiten, erfordern umfangreiche Drittanbieter-Komponenten, .dlls oder ähnliches, oder funktionieren mit Delphi 2010 nicht. Ich will wirklich nur einen kurzen Text "grundlegend" vor'm Auslesen schützen. Gerne nehme ich eine neuere API, hier https://www.delphipraxis.net/174176-...ng-pbkdf2.html wurde z.B. bCrypt erwähnt, was ja dann auf den aktuellen MSDN-APIs aufsetzt. Ist halt die Frage, ob das auch entschlüsseln, oder nur hashen kann. Anderes Thema. |
AW: Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
Schon mal das hier probiert?
https://github.com/winkelsdorf/Delph...tionCompendium Kommt mit einer englisch sprachigen Dokumentations-PDF > 30 Seiten und mehreren Demo Programmen. Minimale Delphi Version: 2009 Und crossplattform kompatibel. Ok, für D2010 irrelevant. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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