Ir al contenido


Foto

Definer variable de C en Delphi


  • Por favor identifícate para responder
14 respuestas en este tema

#1 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 14 agosto 2009 - 06:30

Bueno estoy trabajando en un proyecto con unos amigos de los cuales me dieron un codigo en C y yo quiero llevar algunas partes al delphi.

Como define esta variable en delphi?



cpp
  1. type float (WINAPI* GetMaxHP)();


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 agosto 2009 - 06:43

WINAPI significa que usa la API de windows que sus resultado es un valor Float, espero que un compañero experto en el área de C te pueda ayudar.

Saludos.
  • 0

#3 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 14 agosto 2009 - 07:50

Si eso mismo pense yo, pero no entiendo como poder pasarlo el delphi...
  • 0

#4 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 14 agosto 2009 - 08:57

Ademas como define o como entiendo esta funcion en delphi



cpp
  1. VOID CPlayer_SetMaxAP(PEntity pEntity, float amount)
  2. {
  3. if (pEntity != NULL)
  4. {
  5. __asm
  6. {
  7. mov ecx, pEntity
  8. mov esi, pEntity
  9. push amount
  10. call dword ptr [fpCPlayer_SetMaxAP]
  11. }
  12. }
  13.  
  14. return;
  15. }



Yo la estoy traduciendo asi:



delphi
  1. Procedure CPlayer_SetMaxAP(pEntity: PEntity, amount: float);
  2. begin
  3. if (pEntity <> nil) then
  4. begin
  5. asm
  6.         mov ecx, pEntity
  7. mov esi, pEntity
  8. push amount
  9. call dword ptr [fpCPlayer_SetMaxAP]
  10. end;
  11. end;
  12. end;



Como puedo definer el amount... de tal manera sea lo correcto porque en delphi no existe Float...
  • 0

#5 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 14 agosto 2009 - 10:28

Hay Dios, leo tutoriales de Delphi acerca de punteros pero aun sigo perdido, haber si me dan una manito y un jalon de orejas..



cpp
  1. pEMageMissile: PBYTE;
  2. bSlotNumber: BYTE
  3.  
  4. *(pEMageMissile + 0x8) = bSlotNumber;



y



cpp
  1. PBYTE pEChangeMode
  2. *(DWORD *)(pEChangeMode + 8) = 1;



como lo puedo definier en delphi..

Gracias
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 agosto 2009 - 03:35

Bueno estoy trabajando en un proyecto con unos amigos de los cuales me dieron un codigo en C y yo quiero llevar algunas partes al delphi.

Como define esta variable en delphi?



cpp
  1. type float (WINAPI* GetMaxHP)();




Se trata de la definición de un puntero a una función. Dicha función estarí­a definida así­ en su archivo.h y en su implementación:



cpp
  1. float WINAPI _GetMaxHP();



La traducción serí­a:


delphi
  1. function GetMaxHP(): Single;



Y el Tipo del puntero a esa función lo podrí­amos definir así­:


delphi
  1. TGetMaxHP = function (): Single; stdcall;



Saludos.
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 agosto 2009 - 03:45

Ademas como define o como entiendo esta funcion en delphi



cpp
  1. VOID CPlayer_SetMaxAP(PEntity pEntity, float amount)
  2. {
  3. if (pEntity != NULL)
  4. {
  5. __asm
  6. {
  7. mov ecx, pEntity
  8. mov esi, pEntity
  9. push amount
  10. call dword ptr [fpCPlayer_SetMaxAP]
  11. }
  12. }
  13.  
  14. return;
  15. }



Yo la estoy traduciendo asi:



delphi
  1. Procedure CPlayer_SetMaxAP(pEntity: PEntity, amount: float);
  2. begin
  3. if (pEntity <> nil) then
  4. begin
  5. asm
  6.         mov ecx, pEntity
  7. mov esi, pEntity
  8. push amount
  9. call dword ptr [fpCPlayer_SetMaxAP]
  10. end;
  11. end;
  12. end;



Como puedo definer el amount... de tal manera sea lo correcto porque en delphi no existe Float...


float es un tipo en C que hace referencia a un número en coma flotante que ocupa 32 bits. El similar en delphi serí­a Single.
PEntry se refiere a un puntero de un tipo que el código que tratas de traducir la lo definió. C es muy rí­gido con los tipos. En C PEntry y pEntry son cosas distintas, pero en delphi no.

Tu función serí­a mas o menos esto:



delphi
  1. Procedure CPlayer_SetMaxAP(pEntity: Pointer; amount: Single);
  2. begin
  3. if (pEntity <> nil) then
  4. begin
  5. asm
  6.         mov ecx, pEntity
  7. mov esi, pEntity
  8. push amount
  9. call dword ptr [fpCPlayer_SetMaxAP]
  10. end;
  11. end;
  12. end;



Saludos
  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 agosto 2009 - 04:28

Hay Dios, leo tutoriales de Delphi acerca de punteros pero aun sigo perdido, haber si me dan una manito y un jalon de orejas..



cpp
  1. pEMageMissile: PBYTE;
  2. bSlotNumber: BYTE
  3.  
  4. *(pEMageMissile + 0x8) = bSlotNumber;



y



cpp
  1. PBYTE pEChangeMode
  2. *(DWORD *)(pEChangeMode + 8) = 1;



como lo puedo definier en delphi..

Gracias



La traducción de:


cpp
  1. PBYTE pEMageMissile;  // PBYTE esta definido como BYTE* (un puntero a un BYTE)
  2. BYTE bSlotNumber;
  3.  
  4. *(pEMageMissile + 0x8) = bSlotNumber;



Sarí­a esto:


delphi
  1.  
  2. var 
  3.   pEMageMissile: PBYTE;
  4.   bSlotNumber: BYTE;
  5.  
  6. begin
  7.     PBYTE((DWORD(pEMageMissile) + $08))^:= bSlotNumber;



y la traducción de esto:

cpp
  1. PBYTE pEChangeMode
  2. *(DWORD *)(pEChangeMode + 8) = 1;



Así­:


delphi
  1. var
  2.   pEChangeMode: PBYTE
  3.  
  4. begin
  5.   PDWORD((DWORD(pEChangeMode) + 8))^:= 1;



:D

Saludos.
  • 0

#9 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 agosto 2009 - 05:49

Muchas Gracias escafandra, :D nose que haria yo sin vos  :kiss:

A una mas :D



cpp
  1. BOOL CPlayer_IsAlive(PBYTE pEntity)
  2. {
  3. BOOL bReturn = FALSE;
  4.  
  5. if (pEntity != NULL)
  6. {
  7. __asm
  8. {
  9. mov ecx, pEntity
  10. call dword ptr [fpCPlayer_IsAlive]
  11. mov bReturn, eax
  12. }
  13. }
  14.  
  15. return bReturn;
  16. }



en delphi tengo problemas al deinfier el boolean y que sea usado en asm...



delphi
  1. mov bReturn, eax



como seria la definciion exacta en delphi. Gracias
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 agosto 2009 - 05:55

Pues me imagino que serí­a algo así­:



delphi
  1. function CPlayer_IsAlive(PBYTE: pEntity): boolean;



Saludos.


  • 0

#11 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 agosto 2009 - 05:58

Disculpen, me olvide lo mas importante creo, y donde si me estoy rompiendo la cabeza..



cpp
  1. typedef float (WINAPI* GetMaxHP)();





cpp
  1. FARPROC fpCPlayer_GetMaxHP = NULL;





cpp
  1. float CPlayer_GetMaxHP(PBYTE pEntity)
  2. {
  3. float fReturn = 0;
  4.  
  5. GetMaxHP _GetMaxHP = (GetMaxHP)fpCPlayer_GetMaxHP;
  6.  
  7. if (pEntity != NULL)
  8. {
  9. __asm
  10. {
  11. mov ecx, pEntity
  12. mov esi, pEntity
  13. }
  14.  
  15. fReturn = _GetMaxHP();
  16. }
  17.  
  18. return fReturn;
  19. }


  • 0

#12 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 agosto 2009 - 06:02

Pues me imagino que serí­a algo así­:



delphi
  1. function CPlayer_IsAlive(PBYTE: pEntity): boolean;



Saludos.


Si exacto la definicion de la funcion si entiendo, lo que no entiendo y me trae error o problemas es bool de retorno.


delphi
  1. Function CPlayer_IsAlive(pEntity: PBYTE): Boolean;
  2. var
  3. bReturn: Boolean;
  4. begin
  5. bReturn := false;
  6.  
  7. if (pEntity <> nil) then
  8. begin
  9. asm
  10. mov ecx, pEntity
  11. call dword ptr [fpCPlayer_IsAlive]
  12. mov bReturn, eax
  13. end;
  14. end;
  15.  
  16. result := bReturn;
  17. end;



A la hora de compilar, tengo problemas en:



delphi
  1. mov bReturn, eax



imagino que el tipo de declaracion no es soportada o es incorrecta para una declaracion en asm en delphi.
  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 agosto 2009 - 06:58

Muchas Gracias escafandra, :D nose que haria yo sin vos  :kiss:

A una mas :D



cpp
  1. BOOL CPlayer_IsAlive(PBYTE pEntity)
  2. {
  3. BOOL bReturn = FALSE;
  4.  
  5. if (pEntity != NULL)
  6. {
  7. __asm
  8. {
  9. mov ecx, pEntity
  10. call dword ptr [fpCPlayer_IsAlive]
  11. mov bReturn, eax
  12. }
  13. }
  14.  
  15. return bReturn;
  16. }



en delphi tengo problemas al deinfier el boolean y que sea usado en asm...



delphi
  1. mov bReturn, eax



como seria la definciion exacta en delphi. Gracias




cpp
  1. function CPlayer_IsAlive(pEntity: PBYTE): boolean;
  2. var
  3.   R: integer;
  4. begin
  5. Result:= FALSE;
  6.  
  7. if (pEntity <> nil) then
  8. begin
  9. asm
  10.     mov ecx, pEntity
  11.     call dword ptr [fpCPlayer_IsAlive]
  12.     mov R, eax
  13. end;
  14. end;
  15.         Result:= boolean(R);
  16. end;



Saludos.
  • 0

#14 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 agosto 2009 - 07:11

Disculpen, me olvide lo mas importante creo, y donde si me estoy rompiendo la cabeza..



cpp
  1. typedef float (WINAPI* GetMaxHP)();





cpp
  1. FARPROC fpCPlayer_GetMaxHP = NULL;





cpp
  1. float CPlayer_GetMaxHP(PBYTE pEntity)
  2. {
  3. float fReturn = 0;
  4.  
  5. GetMaxHP _GetMaxHP = (GetMaxHP)fpCPlayer_GetMaxHP;
  6.  
  7. if (pEntity != NULL)
  8. {
  9. __asm
  10. {
  11. mov ecx, pEntity
  12. mov esi, pEntity
  13. }
  14.  
  15. fReturn = _GetMaxHP();
  16. }
  17.  
  18. return fReturn;
  19. }



Mas o menos esto:


delphi
  1. type
  2.   TGetMaxHP = function (): Single; stdcall;
  3.  
  4. var
  5.   fpCPlayer_GetMaxHP: FARPROC;
  6.  
  7. implementation
  8. function CPlayer_GetMaxHP(pEntity: PBYTE): Single;
  9. var
  10.   GetMaxHP: TGetMaxHP;
  11. begin
  12.   Result:= 0;
  13.   GetMaxHP:= TGetMaxHP(fpCPlayer_GetMaxHP);
  14.  
  15.   if (pEntity <>nil) then
  16.   begin
  17.       asm
  18.         mov ecx, pEntity
  19.         mov esi, pEntity
  20.       end;
  21.       Result:= GetMaxHP();
  22.   end;
  23. end;



Saludos.
  • 0

#15 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 agosto 2009 - 08:04

Re Gracias escafandra :D

:wink:
  • 0




IP.Board spam blocked by CleanTalk.