Ver Mensaje Individual
  #14  
Antiguo 01-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 22
cHackAll Va por buen camino
Cool Ok

Cita:
Empezado por PTW
...Supongo que "$67706A2E" es la representación en Hexadecimal de la tabla Ascii de la cadena ".jpg" ¿no?.
Exactamente!

Cita:
Empezado por PTW
...Pero he intentado buscar una cadena que empieza por "ID" (ya que me interesa el valor que tiene viene a continuación: ejemplo ID10)
Debes tener MUY en cuenta que esta funcion que hice, encuentra '.jpg' y recorre luego hacia atras para copiar todo el nombre!

Cita:
Empezado por PTW
...Pero al hacer:
if GetCardinal(lpBuffer[Index]) = $4449 then // 'ID'
nunca entra en ese if
por supuesto, la funcion GetCardinal retorna una variable de 32 bits (4 bytes), de estos solo necesitas 2... entonces con:

Código Delphi [-]
if Word(GetCardinal(lpBuffer[Index])) = $4449 then
solucionas el problema, te lo dejo misma funcion un poco mejorada por si las dudas:

Código Delphi [-]
function GetCardinal(var Buffer): Cardinal;
asm
 mov eax, [eax]
end;
 
const CrLf: Word = $0A0D;
var hFile, Index, Size, Count, Dummy: Cardinal; lpBuffer: PChar; Found: LongBool;
begin
 hFile := CreateFile('c:\250.b00', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 if hFile = INVALID_HANDLE_VALUE then
  begin
   MessageBox(0, 'No se puede acceder al archivo!', nil, MB_ICONEXCLAMATION);
   Exit;
  end;
 lpBuffer := MapViewOfFile(CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil), FILE_MAP_READ, 0, 0, 0);
 Size := GetFileSize(hFile, nil);
 CloseHandle(hFile);
 hFile := CreateFile('c:\FileNames.txt', GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0);
 Index := 0;
 Found := False;
 while Index < Size do
  begin
   if not Found and (Word(GetCardinal(lpBuffer[Index])) = $4449) then // 'ID'
    begin
     Count := 1;
     Inc(Index, 2);
     while lpBuffer[Index + Count] in ['0'..'9'] do Inc(Count);
     WriteFile(hFile, lpBuffer[Index], Count, Dummy, nil);
     WriteFile(hFile, CrLf, 2, Dummy, nil);
     WriteFile(hFile, CrLf, 2, Dummy, nil);
     Inc(Index, Count);
     Found := True;  // No debemos volver a antrar acá, pues puede haber algun nombre de archivo con ID
    end
   else
    if GetCardinal(lpBuffer[Index]) = $67706A2E then // '.jpg'
     begin
      Count := 0;
      while lpBuffer[Index - Count - 1] in ['a'..'z', 'A'..'Z', '0'..'9'] do Inc(Count);
      WriteFile(hFile, lpBuffer[Index - Count], Count + 4, Dummy, nil);
      WriteFile(hFile, CrLf, 2, Dummy, nil);
      Inc(Index, 4);
     end
    else
     Inc(Index);
  end;
 CloseHandle(hFile);
end;

Así y todo me queda la duda de que si los archivos pueden contener el nombre 'ID', en ese caso sirve la variable 'Found'
Además hay la posiblidad de que todos los archivos tengan ESE dato en una posicion fija, pero en todo caso la funcion anterior sirve.

Suerte!
Responder Con Cita