Exemplo de algoritmo Hashing (console / Delphi 6), clique AQUI para download do arquivo DPR.
function EncryptXOR(const Texto: string): string;
var conta: integer;
umchar: char;
umord: smallint;
strtemp:string;
chave: integer;
rand: integer;
begin
// Encriptacao simples "duplo XOR aleatorio".
// A senha encriptada fica 4 vezes maior que a original
// E tambem fica aleatoria (cada vez que eh gerada fica diferente)
// Funciona com strings unicode (para delphi 2009 e acima)
// A funcao reversa precisa ter o mesmo valor da "chave" para funcionar.
Randomize;
rand:=Random(25)+97; // entre 97 e 122 (25)
strtemp:='';
if length(Texto) < 1 then exit;
chave:=chavexor;
for conta := 1 to length((Texto)) do
begin
umchar := Texto[conta];
umord := ord(umchar);
umord := umord xor chave; // encriptacao xor simples
chave := chave + ord(umchar)+rand;
strtemp := strtemp + (inttohex(umord,4));
// transforma em HEX
end;
strtemp := UpperCase(strtemp); // deixa tudo em maiuscula
for conta := 1 to length(strtemp) do
begin
// reencripta o HEX (a senha parece que fica
aleatoria)
strtemp[conta] := chr(ord(strtemp[conta]) + (32 * ( (rand and (1 shl (conta mod 8)) ) shr (conta mod
8) ) ) );
end;
result := chr(rand) + strtemp; // guarda o Rand no primeiro caractere
end;
function DecryptXOR(const Texto: string): string;
var conta: integer;
hextemp: string;
umord: smallint;
strtemp:string;
chave:integer;
rand:integer;
begin
// DesEncriptacao simples "duplo XOR aleatorio".
// A funcao reversa (encriptacao) precisa ter o mesmo valor da "chave" de
encriptacao para funcionar.
hextemp := '';
strtemp:='';
if length(Texto) < 2 then exit;
rand:=ord(Texto[1]); // pega o valor RAND
chave:=chavexor;
for conta := 2 to (length(Texto)) do
begin
// desencripta o HEX
hextemp:=hextemp+ chr(ord(Texto[conta]) - (32 * ( (rand and (1 shl ((conta-1) mod 8)) ) shr ((conta-1) mod
8) ) ) ) ;
if ((conta-1) mod 4) =0 then
begin
hextemp := '$' + hextemp;
umord := StrToIntDef(hextemp,0);
umord := umord xor chave; // desencripta xor
chave := chave + umord+rand;
strtemp:=strtemp+chr(umord);
hextemp:='';
end;
end;
result:=strtemp;
end;
*** colocar antes de implementation ***
type TIntegerObject = class(TObject) private FValue: Integer; public constructor Create(const AValue : integer); property Value: Integer read FValue write FValue; end;
*** colocar depois de implementation ***
constructor TIntegerObject.Create(const AValue : integer); begin FValue := AValue; end;
*** atribuindo itens ***
Combobox1.Items.AddObject('Item 1',TIntegerObject.Create(1)); Combobox1.Items.AddObject('Item 2',TIntegerObject.Create(7));
*** lendo valor inteiro do item selecionado ***
TIntegerObject(Combobox1.Items.Objects[Combobox1.ItemIndex]).Value;
procedure TForm1.DelTree(const Directory: TFileName); var DrivesPathsBuff: array[0..1024] of char; DrivesPaths: string; len: longword; ShortPath: array[0..MAX_PATH] of char; dir: TFileName; procedure rDelTree(const Directory: TFileName); // Recursively deletes all files and directories // inside the directory passed as parameter. var SearchRec: TSearchRec; Attributes: LongWord; ShortName, FullName: TFileName; pname: pchar; begin if FindFirst(Directory + '*', faAnyFile and not faVolumeID, SearchRec) = 0 then begin try repeat // Processes all files and directories if SearchRec.FindData.cAlternateFileName[0] = #0 then ShortName := SearchRec.Name else ShortName := SearchRec.FindData.cAlternateFileName; FullName := Directory + ShortName; if (SearchRec.Attr and faDirectory) <> 0 then begin // It's a directory if (ShortName <> '.') and (ShortName <> '..') then rDelTree(FullName + '\'); end else begin // It's a file pname := PChar(FullName); Attributes := GetFileAttributes(pname); if Attributes = $FFFFFFFF then raise EInOutError.Create(SysErrorMessage(GetLastError)); if (Attributes and FILE_ATTRIBUTE_READONLY) <> 0 then SetFileAttributes(pname, Attributes and not FILE_ATTRIBUTE_READONLY); if Windows.DeleteFile(pname) = False then raise EInOutError.Create(SysErrorMessage(GetLastError)); end; until FindNext(SearchRec) <> 0; except FindClose(SearchRec); raise; end; FindClose(SearchRec); end; if Pos(#0 + Directory + #0, DrivesPaths) = 0 then begin // if not a root directory, remove it pname := PChar(Directory); Attributes := GetFileAttributes(pname); if Attributes = $FFFFFFFF then raise EInOutError.Create(SysErrorMessage(GetLastError)); if (Attributes and FILE_ATTRIBUTE_READONLY) <> 0 then SetFileAttributes(pname, Attributes and not FILE_ATTRIBUTE_READONLY); if Windows.RemoveDirectory(pname) = False then begin raise EInOutError.Create(SysErrorMessage(GetLastError)); end; end; end; // ---------------- begin DrivesPathsBuff[0] := #0; len := GetLogicalDriveStrings(1022, @DrivesPathsBuff[1]); if len = 0 then raise EInOutError.Create(SysErrorMessage(GetLastError)); SetString(DrivesPaths, DrivesPathsBuff, len + 1); DrivesPaths := Uppercase(DrivesPaths); len := GetShortPathName(PChar(Directory), ShortPath, MAX_PATH); if len = 0 then raise EInOutError.Create(SysErrorMessage(GetLastError)); SetString(dir, ShortPath, len); dir := Uppercase(dir); rDelTree(IncludeTrailingBackslash(dir)); end;
É possível colocar qualquer tipo de arquivo dentro do executável gerado no Delphi, e depois extrair chamando uma Procedure no programa.
1 - Copiar o arquivo a ser incluído para o mesmo diretório dos fontes do programa.
2 - Criar um arquivo com extensão .rc, por exemplo temp.rc e colocar a seguinte linha:5 - Colocar a procedure no inicio do código:
Ao chamar a procedure putbinresto('NOME', '.\arquivo.txt'); o arquivo vai ser extraído para o diretório atual do executável.