Page 1 of 1

RtlMoveMemory de Kernel32.dll (MemCopy) casca a lo bestia

Posted: Mon May 28, 2007 3:02 pm
by JmGarcia
Este codigo fuente en 16 bits funciona perfectamente, en 32 bits cuando ejecuta el MemCopy (RtlMoveMemory de Kernel32.dll) da un casque bestial y me dice:

Programa.exe a generado errores y sera cerrado por Windows
Debe reiniciar el programa
Se creara un registro de error


¿ Que puede ser ?

Code: Select all

function Main()

public OneOpt:=space(4)
public OneOptL:=1

STRUCT WSAData
  MEMBER wVersion  AS WORD
  MEMBER wHighVer  AS WORD
  MEMBER szDescrip AS STRING LEN WSADESCRIPTION_LEN
  MEMBER szSystem  AS STRING LEN WSASYS_STATUS_LEN
  MEMBER iMaxSock  AS WORD
  MEMBER iMaxUdpDg AS WORD
  MEMBER lpVendor  AS LONG
ENDSTRUCT

cTemp:=WSAData:cBuffer
rc:=WSAStartup(0x101,@cTemp) 
WSAData:cBuffer:=cTemp
if rc != 0
   MsgAlert("Error en WSASTARTUP"+chr(13)+;
            "NO SE PUEDE CONTINUAR"+chr(13)+;
            "Error numero "+alltrim(str(rc)))
   return nil
endif

SocketNum:=socket(AF_INET,SOCK_DGRAM,IPPROTO_IP)
if SocketNum<0
   MsgAlert("Error en SOCKET")
   SocketNum:=-1
   return nil
endif

MemCopy(OneOpt,OneOptL,Len(OneOpt)) // Casque bestial

rc:=setsockopt(SocketNum,SOL_SOCKET,SO_REUSEADDR,OneOpt,Len(OneOpt))
if rc<>0
   MsgAlert("Fallo en SERSOCKOPT-1")
   SocketNum:=-1
   return nil
endif

etc...

return nil

DLL32 FUNCTION MemCopy(dest AS LPSTR, src AS LPSTR, cb AS LONG ) AS VOID PASCAL FROM "RtlMoveMemory" LIB "Kernel32.dll"
FWH 7.5 y su correspondiente xHarbour.

Posted: Mon May 28, 2007 5:08 pm
by Antonio Linares
Tienes declarado OneOptL:=1 como número y no como cadena.

Además cambia AS WORD por AS LONG, ya que estamos en 32 bits

Posted: Mon May 28, 2007 7:09 pm
by JmGarcia
Antonio Linares wrote:Tienes declarado OneOptL:=1 como número y no como cadena.
Pues en 16 bits si funciona... lo podre CHAR/STRING.
Antonio Linares wrote:Además cambia AS WORD por AS LONG, ya que estamos en 32 bits
Precisamente el LONG es el que no puedo usar.
Los _INT en la aplicaciones de 16 bits son de 2 bytes.
Su omonimo para 32 bits ha de ser de 2 bytes y ese es el WORD.
A las funciones de DLLs del API hay que mandarle el cBuffer con el mismo tamaño que en 32 bits. Las DLLs son las mismas.

Por cierto, ¿ cuales son los tipos de datos de las estructuras ?
Solo he visto WORD, STRING, LONG y no se mas (en 32 bits claro)
Necesito datos numericos con signo y sin signo.

Posted: Mon May 28, 2007 7:55 pm
by Antonio Linares
> Su omonimo para 32 bits ha de ser de 2 bytes y ese es el WORD.

Si, es cierto. Esa estructura en 32 bits sigue usando shorts (2 bytes).

BYTE -> 1 byte
_INT -> 2 bytes
LONG -> 4 bytes

En cuanto a signo ó no, depende de como se interprete el bit más alto. Es algo que se puede calcular a posteriori

Posted: Mon May 28, 2007 9:17 pm
by JmGarcia
Antonio Linares wrote:_INT -> 2 bytes
A mi _INT me sale de 4 octetos.
WORD es de 2 octetos.
DWORD son 4 octetos.
BOOL es de 2 octetos.

En xHarbour son:

Code: Select all

   #define CTYPE_CHAR 1
   #define CTYPE_UNSIGNED_CHAR -1
   #define CTYPE_CHAR_PTR 10
   #define CTYPE_UNSIGNED_CHAR_PTR -10

   #define CTYPE_SHORT 2
   #define CTYPE_UNSIGNED_SHORT -2
   #define CTYPE_SHORT_PTR 20
   #define CTYPE_UNSIGNED_SHORT_PTR -20

   #define CTYPE_INT 3
   #define CTYPE_UNSIGNED_INT -3
   #define CTYPE_INT_PTR 30
   #define CTYPE_UNSIGNED_INT_PTR -30

   #define CTYPE_LONG 4
   #define CTYPE_UNSIGNED_LONG -4
   #define CTYPE_LONG_PTR 40
   #define CTYPE_UNSIGNED_LONG_PTR -40

   #define CTYPE_FLOAT 5
   #define CTYPE_FLOAT_PTR 50

   #define CTYPE_DOUBLE 6
   #define CTYPE_DOUBLE_PTR 60

   #define CTYPE_VOID_PTR 7

etc...
En FWH ¿ donde estan esas constantes ?

Posted: Mon May 28, 2007 10:41 pm
by Antonio Linares
> A mi _INT me sale de 4 octetos.

Si, cierto

Las constantes estan en include\dll.ch