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

Post Reply
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

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

Post 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.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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 ?
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

> A mi _INT me sale de 4 octetos.

Si, cierto

Las constantes estan en include\dll.ch
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply