FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
C++ a Delphi?
Hola que tal estan? Estoy intentando convertir este pedazo de codigo de c++ a delphi pero se me esta complicando, tal vez puedan darme una mano?
C++ Código:
bool Match(const BYTE * pData, const BYTE * bMask, const char * szMask) { for (; *szMask; ++szMask, ++pData, ++bMask) if (*szMask == 'x' && *pData != *bMask) return false; return (*szMask) == NULL; } Código:
function Match(const pData:PBYTE; bMask:PBYTE; const szMask:PCHAR) : boolean; var i: integer; begin Result := true; for i := 0 to StrLen(szMask)-1 do if((szMask^ = 'x') and (pData^ <> bMask^)) then Result := false; break; inc(szMask); inc(pData); inc(bMask); end; Código:
[Error] test.dpr(36): Left side cannot be assigned to [Error] test.dpr(37): Left side cannot be assigned to Código:
inc(szMask); inc(pData); |
#2
|
|||
|
|||
Hola...
El problema que veo es que tratas de ejecutar código luego del break, lo cual no es posible, ya que el break rompe el ciclo for. Saludos... |
#3
|
||||
|
||||
Hola Delshire, bienvenido a los foros de Club Delphi
La observación maeyanes es correcta, y dado que en el código original usas return yo emplearía el procedimiento Exit en lugar de Break. No hice comprobaciónes, pero fijate si te funciona de este modo:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#4
|
|||
|
|||
Cita:
Cita:
La funcion parece compilar perfectamente, el problema es que la tengo ligada a otra funcion (la llamo de otra funcion) y probarla se hace un poco dificil, como soy nuevo en delphi y estoy traduciendo puramente de C++ seguramente tengo errores pero estoy investigando lo mas profundo posible. Código:
Function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal ; stdcall; var i : Cardinal; begin for i := 0 to dwLen do if(Match(PBYTE(dwAddress + i), bMask, szMask)) then Result := Cardinal((dwAddress + i)) else Result := 0; end; Código:
DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE * bMask, char * szMask) { for (DWORD i = 0; i < dwLen; i++) if (Match((BYTE*)(dwAddress + i), bMask, szMask)) return (DWORD)(dwAddress + i); return 0; } Muchas Gracias por la ayuda! |
#5
|
|||
|
|||
Cita:
Cambie un poco la funcion: Código:
Function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal ; stdcall; var f : Cardinal; begin while (f < dwLen) do begin if(Match(PBYTE(dwAddress + f), bMask, szMask)) then begin Result := Cardinal((dwAddress + f)); Exit; end; Inc(f); Result := 0; end; end; Por ejemplo si yo creo un .exe en delphi con una funcion que se ejecuta en el main esos valores que yo dije arriba serian: Código:
program test; {$APPTYPE CONSOLE} uses SysUtils; function Match(pData:PBYTE; bMask:PBYTE; szMask:PCHAR) : boolean; stdcall; external 'test.dll'; Function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal ; stdcall; external 'test.dll'; function test() : string; begin Result := 'Hola' end; var i : Cardinal; j : Cardinal; k : PBYTE; l : PCHAR; tmp : string; begin i := Cardinal(401000); j := Cardinal(8000); tmp := '\x53\x8B\xD8\x8B\xC3\xBA\x00\x00\x00\x00\xE8\x00\x00\x00\x00'; k := PBYTE(tmp); l := PCHAR('xxxxxx????x????'); WriteLn(test); WriteLn(FindPattern(i,j,k,l)); ReadLn; end. Cuando imprimo el valor del FindPattern me devuelve: 4229464 en vez de 4088CC. Supongo que debe ser o un problema al pasar los parametros o ya de la funcion FindPattern. Muchas Gracias por la atencion. Última edición por ecfisa fecha: 04-06-2016 a las 01:15:00. Razón: agregar enlace a imágen |
#6
|
||||
|
||||
Hola.
Algo que noto en la función FindPattern, es que la variable f no está inicializada: Luego en la salida con Writeln, tendrías que indicarle el formato hexa:
Fijate si esas observaciones te son útiles, de no ser así, avisa y seguimos revisando. Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#7
|
|||
|
|||
Muy bueno lo del IntToHex, no sabia de esa funcion.
Con respecto a lo de la inicializacion si pongo f := 0 la aplicacion crashea por algun motivo. Es posible pasarle 0 como valor habiendolo declarado como Cardinal? Gracias por la ayuda. |
|
|
|