![]() |
Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
Hallo zusammen,
ich verwende eine nette Funktion die ich hier gefunden habe: ![]() 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 ![]() |
AW: Inkompatible Typen: 'PByte' und 'Pointer' -- nur manchmal?
Schon mal das hier probiert?
![]() 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 22:13 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