API en vb.NET

Iniciado por Robokop, 15 Junio 2006, 23:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Robokop

API EN VISUAL BASIC.NET
[/b]


Todos sabemos que las API constituyen una parte importante de la programación , ya que nos permite ejecutar ordenes del sistema .
En Visual Basic . Net , Microsoft nos esta facilitando mucho el trabajo porque ya no es necesario tantas declaraciones largas y complejas que nos  cuesta trabajo aprenderlas y usarlas .
Ahora las declaraciones son muy cortas y están señaladas allí, por lo que nos podemos dar cuenta de todas las funciones que existen y utilizando la logica podemos usarlas.

Para usarlas las podemos importar para solamente usar la función o hacer toda la declaración en una sola llamada.
Para importarlas  basta con poner la sentencia  imports y <Declaración> antes de la clase del proyecto o del sub main ().

Para usar las declaraciones nos iniciamos con system, que nos permite hacer llamadas al sistema , después le continuamos con lo que vayamos a usar y así sucesivamente con punto un ejemplo seria :


Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        System.DateTime.Now()
End Sub
End Class


Para importar desde el principio nos quedaria asi:

Imports System.DateTime
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class


Vemos con diferencia que no esta la palabra .now pues bien esto es porque se generaliza para luego cuando las usemos con métodos las podamos especificar.

Ya terminándola se usar completamente podría ser así:

Imports System.DateTime
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(DateTime.Now)
    End Sub
End Class



Y como resultado obtenemos la fecha y hora local.
La cosa se complicara un poco al utilizarlas al llamarlas como vemos esta muy fácil lo que no era en la versión 6 y anteriores.

Recordemos que las llamadas a las API también se pueden hacer en modo de consola .

Otro ejemplo en modo de consola seria :

Imports System.Security
Module Module1

    Sub Main()
        Console.WriteLine("Nombre de usuario:" & Principal.WindowsIdentity.GetCurrent.Name)
        Console.ReadKey()

    End Sub

End Module


Con lo que nos devuelve el nombre del usuario de Windows.

O bien sin importarlos desde el principio seria:

Module Module1

    Sub Main()
        Console.WriteLine("Nombre De Usuario" & System.Security.Principal.WindowsIdentity.GetCurrent.Name)
        Console.ReadKey()

    End Sub

End Module


Bueno al fin Microsoft pensó en algo que nos seria útil.
Este ejemplo nos sirve para mover el cursor determinadas coordenadas.
Usa poínt. Porque es el punto donde vamos a mover el cursor , me costo trabajo sacar este método pero si practicas ya veras que no es tan complicado

Imports System.Windows.Forms.Cursor

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Cursor.Position = New Point(Cursor.Position.X - 200, Cursor.Position.Y - 200)

    End Sub
End Class


Aqui un ejemplo de como saber la posicion del cursor en windows.

Imports system.Windows.Forms.Cursor
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim PosX As Integer, PosY As Integer
        PosX = Current.Position.X
        PosY = Current.Position.Y
        MsgBox(PosX & "-" & PosY)
    End Sub
End Class


El porque usamos current ? , pues bien es para obtener la actual y almacenamos en PosX la posicion de la coordenada X y Y para luego mostrarlas en un msgbox  , este fue el metodo que a mi se me ocurrio , pero cada quien tiene diferentes tecnicas y puede crear otras formas , no importa la forma en que se obtenga lo que importa es que de el mismo resultado.

Ahora gracias a este metodo implementado la programación en Visual Basic sera menos limitante y mas rapido para hacer cosas complicadas , ustedes pueden compar un codigo en Visual Basic anteriormente para obtener estos resultados y ver este en .Net y darse cuenta que nos haorramos unas 10 lineas que no son nada facil de memorizar.

Para obtener informacion sobre que hace cada función , le tenemos que dar click al boton que dice object browser, donde te explican cada función, ese boton se encuentra en la barra de tareas en la parte superior a lado izquierdo del martillo y de la llave que es para obtener el toolbox (Esto es en Visual Studio de microsoft).

A continuación expongo una guia de MSDN para llamar a las apis que usa varios metodos , y recordemos que este lenguaje apenas se esta dando a luz y empiezan a aumentar los recursos en internet , asi que busquemos e investiguemos sobre esto para poder colaborar en cosas que todavía no son muy conocidas.


PD:El autocompletado de las funciones solamente las probe en Visual Studio , no se si otros IDES autocompleten.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TUTORIAL:llamar a las Api de windows
[/b]


Las API de Windows son bibliotecas de vínculos dinámicos (DLL) que forman parte del sistema operativo Windows. Se utilizan para realizar tareas cuando resulta difícil escribir procedimientos equivalentes. Por ejemplo, Windows proporciona una función denominada FlashWindowEx que permite que la barra de título de una aplicación alterne entre un sombreado claro y otro oscuro.

La ventaja de utilizar las API de Windows en el código es que pueden ahorrar tiempo porque contienen numerosas funciones útiles ya escritas y listas para utilizar. La desventaja es que puede resultar difícil trabajar con las API de Windows y pueden ser implacables cuando las cosas van mal.

Las bibliotecas de vínculos dinámicos (DLL) de Windows representan una categoría especial de interoperabilidad. Las API de Windows API no utilizan código administrado, no tiene bibliotecas de tipos incorporadas y utilizan tipos de datos que son diferentes a los utilizados con Visual Studio .NET. Debido a estas diferencias y a que las API de Windows no son objetos COM, la interoperabilidad con las API de Windows y la plataforma .NET se lleva a cabo utilizando invocación de la plataforma, o PInvoke. Invocación de la plataforma es un servicio que permite al código administrado llamar a funciones no administradas implementadas en archivos DLL. Para obtener más información, vea Utilizar funciones de DLL no administradas.
Puede utilizar PInvoke en Visual Basic .NET mediante la instrucción Declare o aplicando el atributo DllImport a un procedimiento vacío.

Las llamadas de API de Windows eran una parte importante de la programación con Visual Basic en el pasado, pero rara vez son necesarias con Visual Basic .NET. Siempre que sea posible, debe utilizar código administrado de .NET Framework para realizar tareas en lugar de llamadas a API de Windows. Este tutorial proporciona información para aquellas situaciones en las que es inevitable el uso de API de Windows.

Llamadas a API utilizando Declare

El modo más común de llamar a API de Windows es a través de la instrucción Declare.

Para declarar un procedimiento de DLL

   1. Determine el nombre de la función que desea llamar y sus argumentos, tipos de argumento y valor devuelto, así como el nombre y la ubicación de la DLL que la contiene.

          Nota   Para obtener información completa sobre las API de Windows, vea la documentación de la API de Windows incluida en el SDK de la plataforma. Para obtener más información sobre las constantes que utilizan las API de Windows, vea los archivos de encabezado, como Windows.h, que se incluyen en el SDK de la plataforma.

   2. En el menú Archivo, haga clic en Nuevo para abrir un nuevo proyecto de aplicación para Windows y, a continuación, haga clic en Proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto.
   3. Seleccione Aplicación para Windows en al lista de plantillas de proyecto de Visual Basic. Aparecerá el proyecto nuevo.
   4. Agregue la siguiente función Declare a la sección de declaración del formulario de inicio del proyecto o la sección de declaración de la clase o módulo donde desea utilizar la DLL:

Declare Auto Function MBox Lib "user32.dll" _
Alias "MessageBox" (ByVal hWnd As Integer, _
   ByVal txt As String, ByVal caption As String, _
   ByVal Typ As Integer) As Integer


Partes de la instrucción Declare
La instrucción Declare incluye los siguientes elementos.

Modificador Auto

El modificador Auto indica al motor de tiempo de ejecución que convierta la cadena basada en el nombre del método de acuerdo con las reglas de Common Language Runtime (o el alias, si se ha especificado)

Palabras clave Lib y Alias

El nombre que sigue a la palabra clave Function es el nombre que utiliza el programa para tener acceso a la función importada. Puede ser igual que el nombre real de la función a la que llama; o bien, puede utilizar cualquier nombre de procedimiento válido y utilizar después la palabra clave Alias para especificar el nombre real de la función a la que llama.

Especifique la palabra Lib seguida por el nombre y la ubicación de la DLL que contiene la función a la que llama. No es necesario que especifique la ruta de acceso de los archivos ubicados en los directorios del sistema de Windows.

Utilice la palabra clave Alias si el nombre de la función a la que llama no es un nombre de procedimiento de Visual Basic válido, o crea algún conflicto con el nombre de otros elementos de la aplicación. Alias indica el nombre verdadero de la función a la que se llama.

Declaraciones de argumentos y tipos de datos

Declare los argumentos y sus tipos de datos. Esta parte puede resultar desafiante porque los tipos de datos que utiliza Windows no se corresponden con los tipos de datos de Visual Studio. Visual Basic realiza gran parte del trabajo convirtiendo los argumentos en tipos de datos compatibles, un proceso denominado cálculo de referencias. Puede controlar de manera explícita cómo se calculan las referencias de los argumentos utilizando el atributo MarshalAs definido en el espacio de nombres System.Runtime.InteropServices.

    Nota   Las versiones anteriores de Visual Basic permitían declarar parámetros As Any, lo que significa que se podían utilizar datos de cualquier tipo. Visual Basic .NET requiere que se utilice un tipo de datos específico para todas las instrucciones declare.

Constantes de las API de Windows

Algunos argumentos son combinaciones de constantes. Por ejemplo, la API MessageBox que se muestra en este tutorial acepta un argumento Integer denominado Typ que controla cómo se muestra el cuadro de mensaje. Para determinar el valor numérico de estas constantes, puede examinar las instrucciones #define del archivo WinUser.h. Los valores numéricos suelen mostrarse en hexadecimal, así que deberá utilizar una calculara para sumarlos y convertirlos al sistema decimal. Por ejemplo, si desea combinar las constantes del estilo de exclamación MB_ICONEXCLAMATION 0x00000030 y el estilo sí/no MB_YESNO 0x00000004, puede sumar los números y obtener el resultado de 0x00000034, o 52 decimal. Aunque puede utilizar el resultado decimal directamente, es mejor declarar estos valores como constantes en la aplicación y combinarlos utilizando el operador Or.

Para declarar constantes para las llamadas a API de Windows

1º# Consulte la documentación de la función de Windows a la que va a llamar y determine el nombre de las constantes que utiliza, así como el nombre del archivo .h que contiene los valores numéricos para estas constantes.
2º# Utilice un editor de texto, como el Bloc de notas, para ver el contenido del archivo .h y busque los valores asociados con las constantes que está utilizando. Por ejemplo, la API MessageBox utiliza la constante MB_ICONQUESTION para mostrar un signo de interrogación en el cuadro de mensaje. La definición para MB_ICONQUESTION está en WinUser.h y aparece como sigue:

define MB_ICONQUESTION             0x00000020L

Agregue instrucciones Const equivalentes a la sección de declaraciones de la clase o módulo para que estas constantes estén disponibles para la aplicación. Por ejemplo:

Const MB_ICONQUESTION = &H20L
Const MB_YESNO = &H4
Const IDYES = 6
Const IDNO = 7


Para llamar al procedimiento de DLL

# Agregue un botón denominado Button1 al formulario de inicio del proyecto y haga doble clic en él para ver su código. Aparecerá el controlador de eventos del botón.
# Agregue código al controlador de eventos Click para el botón que ha agregado para llamar al procedimiento, y proporcione los argumentos correspondientes:

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          Handles Button1.Click
   Dim RetVal As Integer ' Stores the return value.
   RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", _
                 MB_ICONQUESTION Or MB_YESNO)
' Check the return value.
   If RetVal = IDYES Then
      MsgBox("You chose Yes")
   Else
      MsgBox("You chose No")
   End If
End Sub


Presione F5 para ejecutar el proyecto. El cuadro de mensaje aparecerá con dos botones de respuesta Yes y No. Haga clic en alguno de ellos.

Robokop

#1
Cálculo de referencias de datos

Visual Basic .NET convierte automáticamente los tipos de datos de los parámetros y devuelve valores para las llamadas a API de Windows, pero puede utilizar el atributo MarshalAs para especificar de manera explícita los tipos de datos no administrados que espera una API. Para obtener más información sobre la interoperabilidad del cálculo de referencias, vea Cálculo de referencias de interoperabilidad

Para utilizar Declare y MarshalAs en una llamada a una API

1º Determine el nombre de la función a la que desea llamar y sus argumentos, tipos de datos y valor devuelto.
2º Para simplificar el acceso al atributo MarshalAs, agregue una instrucción Imports a la parte superior del código de la clase o módulo, como en el siguiente ejemplo:

Imports System.Runtime.InteropServices

3º Agregue el prototipo de una función para la función importada a la sección de declaraciones de la clase o módulo que está utilizando y aplique el atributo MarshalAs a los parámetros o al valor devuelto. En el siguiente ejemplo, se calculan las referencias de una llamada a una API que espera el tipo Void* como UnmanagedType.AsAny:

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (ByVal x As Short, _
      <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object


Llamadas a API utilizando DllImport

El atributo DllImport proporciona otro modo de llamar a funciones de DLL sin bibliotecas de tipos. DllImport equivale al uso de una instrucción Declare pero proporciona control sobre cómo se llama a las funciones.

Puede utilizar DllImport con la mayoría de las llamadas a API de Windows siempre y cuando la llamada haga referencia a un método compartido (a veces denominado static). No puede utilizar métodos que requieran una instancia de una clase. A diferencia de las instrucciones Declare, las llamadas a DllImport no pueden utilizar el atributo MarshalAs.

Para llamar a una API de Windows utilizando el atributo DllImport

1º En el menú Archivo, haga clic en Nuevo para abrir un nuevo proyecto de aplicación para Windows y, a continuación, haga clic en Proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto.
2º Seleccione Aplicación para Windows en al lista de plantillas de proyecto de Visual Basic. Aparecerá el proyecto nuevo.
3º Agregue un botón denominado Button2 al formulario de inicio.
4º Haga doble clic en Button2 para abrir la vista de código del formulario.
5º Para simplificar el acceso a DllImport, agregue una instrucción Imports a la parte superior del código para la clase del formulario de inicio:

Imports System.Runtime.InteropServices

6º Declare una función vacía que preceda a la instrucción End Class para el formulario y dé a la función el nombre MoveFile.
7º Aplique los modificadores Public y Shared a la declaración de la función y establezca parámetros para MoveFile de acuerdo con los argumentos que utiliza la función de la API de Windows:
Public Shared Function _
MoveFile(ByVal src As String, ByVal dst As String) As Boolean
   ' Leave the body of the function empty.
End Sub



La función puede tener cualquier nombre de procedimiento válido; el atributo DllImport especifica el nombre de la DLL. También controla la interoperabilidad del cálculo de referencias para los parámetros y valores devueltos, de manera que puede elegir los tipos de datos de Visual Studio .NET que sean similares a los tipos de datos que utiliza la API.
8º Aplique el atributo DllImport a la función vacía. El primer parámetro es el nombre y la ubicación de la DLL que contiene la función a la que llama. No es necesario que especifique la ruta de acceso de los archivos ubicados en los directorios del sistema de Windows. El segundo parámetro es el argumento con nombre que especifica el nombre de la función de la API de Windows:

<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function _
MoveFile(ByVal src As String, ByVal dst As String) As Boolean
   ' This function copies a file from the path src to the path dst.
   ' Leave function empty - DllImport attribute forces calls
   ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Func


9º Agregue código al controlador de eventos Button2_Click para llamar a la función:

Private Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          Handles Button2.Click
   Dim RetVal As Boolean
   RetVal = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")
   If RetVal = True Then
      MsgBox("The file was moved successfully.")
   Else
      MsgBox("The file could not be moved.")
   End If
End Sub


10º Cree un archivo con el nombre Test.Txt y colóquelo en el directorio C:\Tmp del disco duro. Cree el directorio Tmp si es necesario.
11º Presione F5 para iniciar la aplicación. Aparecerá el formulario principal.
12º Haga clic en Button2. Aparecerá el mensaje "El archivo se ha movido correctamente" si se puede mover el archivo.

FUENTE http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vbcn7/html/vaconCallingWindowsAPIs.asp

PARA MAYOR INFORMACION SOBRE LLAMADAS VEASE: http://msdn2.microsoft.com/en-us/library/system.media(VS.80).aspx

BADBYTE-K

Muy buen recurso, gracias por el aporte.

Solo me gustaria agregar que esa nueva organizacion de las clases en .NET en forma de jerarquia ordenada se conocen como namespaces o espacios de nombre, esta organizacion que proporciona el .net framework, nos da una vista orientada a objetos y nos permite con mayor facilidad el desarrollo de aplicaciones a la vez que nos proporciona un mayor control en lo que se refiere a los nombres de las clases para evitar ambiguedades que se daban anteriormente.

Solo un detalle que no comparto contigo  :P

Citary recordemos que este lenguaje apenas se esta dando a luz y empiezan a aumentar los recursos en internet

No, yo creo que con aproximadamente 6 años ya VB.NET se ha posicionado como un grande que se codea con los mejores. Por supuesto se ha visto superado por C# en algunos aspectos, pero no tiene nada que envidiarle a los grandes del mercado.

Para trabajar interoperabilidad COM y .NET  en resumen con PInvoke,  el segundo articulo que nos proporcionas es de oro  :D muy buena info ya que todos en algun momento debemos desempolvar esta clase de practicas.

CitarPD:El autocompletado de las funciones solamente las probe en Visual Studio , no se si otros IDES autocompleten.

Creo que te refieres a cuando escribes por ejemplo System. el IDE te carga una lista de lo que contiene el espacio de nombres System. Esta propiedad se conoce como IntelliSense y pues si no mal recuerdo MonoDevelop no la incorpora, pero SharpDevelop creo que si, Espero no estar confundiendo alguna practica de vs con SharpDevelop xD


Saludos, Gracias por el aporte.