Por eso , tendrías alguna guía PDF que explique y enseñe bien vb.net
No me verás nunca recomendar un libro de programación .NET, ya que siempre he considerado que la "guía" que mejor explica y enseña bien programación .NET (C#/VB.NET) y Windows desde los detalles fundamentales hasta el detalle más pequeño e insignificante, esa es la página de msdn.microsoft.com y docs.microsoft.com. No hay guía más completa, eso si, hay que leer sus artículos ya teniendo aprendidos algunos conceptos básicos de la POO (aunque de todas formas en la MSDN también te enseñan los conceptos de la POO de forma profundizada y enfocada a .NET, pero para aprender POO ya si que sería mejor leer un libro que lo "centralice" todo en un buen sumario de contenidos).
Para iniciarse en VB.NET viniendo previamente de VB6, tienes al menos estos recursos de ayuda que encontré:
Sobre la migración:
Guías de iniciación:
+
Y aquí tienes mucho más, incluyendo videotutoriales y de todo un poco variado:
yo utilice :
Public Declare Function ReadProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByVal lpBuffer As String, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer) As Integer
en cambio tu :
<DllImport("Kernel32.dll", SetLastError:=True)>
Friend Shared Function ReadProcessMemory(ByVal hProcess As IntPtr,
ByVal baseAddress As IntPtr,
ByVal buffer As IntPtr,
ByVal size As UInteger,
ByRef refNumberOfBytesRead As Integer
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
La diferencia más notable (aparte de estar utilizando el keyword
Declare) es que la firma de esa función (los parámetros) no son portables. Si iniciamos la herramienta de análisis de código incluida en Visual Studio, esto son los avisos que nos lanza:
Bien, ¿pero esto que quiere decir exactamente?, pues en pocas palabras significa que esa función solo es compatible con procesos de 32 Bit, NO es compatible con 64 Bits. En este contexto nos referimos al término 'Portabilizar' para compatibilizar la firma de una función nativa para que pueda ejecutarse correctamente en arquitecturas x86 y x64, y para ello debes utilizar el tipo de tamaño dinámico
IntPtr (en otros casos utilizarías
UIntPtr), que son 4 bytes en 32 Bits, y 8 bytes en 64 Bits. En tu declaración, el datatype que asignas es
Integer, que son 4 bytes en ambas arquitecturas.
...así que ten mucho cuidado cuando copies de Internet declaraciones de funciones nativas al estilo de VB6, por que probablemente sea código extraido directamente de VB6 de la época en que Jesucristo aprendió a programar, y por aquél entonces no se programaba con compatibilidad para X64, y cambiar el
datatype Integer por
Long no es una solución ya que en realidad seguirás teniendo el mismo problema solo que al revés, es decir, una función compatible con 64 Bits y no compatible con 32 Bits.
no entiendo esto :[/b]
<MarshalAs(UnmanagedType.Bool)> Boolean
'
MarshalAs' es un atributo de clase expuesto en el espacio de nombres
System.Runtime.InteropServices, todos los miembros de ese namespace sirven para interoperar con código no administrado.
Lo que hace '
MarShalAs' es una serialización (o marshalling) de tipos entre el código administrado (.NET) y el no administrado (C/C++ de la librería Kernel32.dll en este caso):
Dicho de otra forma para que lo entiendas: se puede decir más o menos que lo que hace es un casteo o conversión de tipos, en este caso de
Integer a
Boolean.
¿Y por qué lo convierto a
Boolean?, pues por una sencilla y evidente razón...
Si revisamos la documentación oficial de la función
ReadProcessMemory en la MSDN, nos dice lo siguiente:
Return value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is 0 (zero).
Y si revisamos la documentación del datatype
Boolean (o
bool en
C#), nos dice esto otro:
When Visual Basic converts numeric data type values to Boolean, 0 becomes False and all other values become True
¿Pillas por donde voy?. El valor de retorno de la función
ReadProcessMemory es traducible en equivalencia a un valor
Boolean, donde cero es False, y todo lo demás es True (-1), por ende, devolver un valor
Integer no sería lo más eficiente ya que nos es mucho más favorable y productivo evaluar si el resultado es True o False, en lugar de andarse con números.
Por último, con respecto al servicio de invocación de plataforma de .NET más conocido en Inglés como
Platform Invoke (o
P/invoke a secas), mira si tienes información de todo tipo con la que puedes aprender su significado, propósito, implementación, y utilización:
+
+
+
+
+
Saludos!