elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
12 Octubre 2008, 05:04  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General (Moderadores: Hendrix, E0N)
| | |-+  NekroAyuda: Trabajar con APIs en Visual Basic 6.0.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: NekroAyuda: Trabajar con APIs en Visual Basic 6.0.  (Leído 4232 veces)
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
NekroAyuda: Trabajar con APIs en Visual Basic 6.0.
« en: 13 Marzo 2005, 03:38 »

Citar
Extraido de las Librerías de Microsoft Developers NetWork.

API

Un acrónimo de Interfaz de programación de aplicaciones, el conjunto de comandos que utiliza una aplicación para solicitar y realizar servicios de nivel inferior del sistema operativo del PC. La API de Microsoft Visual FoxPro contiene comandos que permiten a las rutinas de C y lenguaje ensamblador interactuar con Visual FoxPro.


Acceso a las características bidireccionales de la API de Windows

Las características bidireccionales de las API de Windows se suelen implementar como argumentos y constantes adicionales para las funciones estándar de las API. La colección de archivos de texto de la API que se pueden examinar con el Visor de API, específicamente Win32api.txt, incluye referencias a los argumentos y constantes de las características bidireccionales. Puede copiar y pegar en el código la sintaxis correcta que se muestra en estos archivos.

Estos argumentos y constantes pueden incluirse en las llamadas a la API de Windows en cualquier versión de Microsoft Windows de 32 bits. Sin embargo, las llamadas a la API sólo ejecutarán la función bidireccional solicitada si el sistema operativo es una versión bidireccional de Microsoft Windows de 32 bits, como Microsoft Windows 95 Árabe.


Bidireccional.

'Bidireccional' es un término genérico utilizado para describir los productos de software que admiten el árabe y otros idiomas que se escriben de derecha a izquierda. Más específicamente, el término bidireccional hace referencia a la capacidad del producto para manipular y presentar texto escrito en idiomas que se leen de izquierda a derecha o de derecha a izquierda. Por ejemplo, es necesario disponer de la capacidad bidireccional para mostrar una frase que contiene palabras escritas en inglés y en árabe.


Acceso a las DLL y a la API de Windows.

Cuando necesite capacidades que vayan más allá del lenguaje y los controles comunes proporcionados por Microsoft Visual Basic, puede llamar directamente a los procedimientos incluidos en las bibliotecas de vínculos dinámicos (DLL, Dinamyc Link Libraries). Al llamar a estos procedimientos, podrá tener acceso a los miles de procedimientos que constituyen la espina dorsal del sistema operativo Microsoft Windows, así como a rutinas creadas en otros lenguajes.

Como su nombre sugiere, los archivos DLL son bibliotecas de procedimientos a los que las aplicaciones se pueden vincular y usar en tiempo de ejecución, en lugar de vincularse estáticamente en tiempo de compilación. Esto implica que las bibliotecas se pueden actualizar independientemente de la aplicación y muchas aplicaciones pueden compartir una única DLL. El propio entorno Microsoft Windows está formado por DLL, y otras aplicaciones llaman a los procedimientos incluidos en estas bibliotecas para mostrar ventanas y gráficos, administrar la memoria o realizar otras tareas. A veces, estos procedimientos reciben el nombre de API de Windows o interfaz de programación de aplicaciones.


¿DLL o Automatización?

Otra forma de potenciar Visual Basic es mediante la Automatización (anteriormente denominada Automatización OLE). Usar la Automatización es más sencillo que llamar a las rutinas de un archivo DLL y no conlleva los mismos riesgos que si tiene acceso directamente a la API de Windows. Al usar Automatización, podrá tener acceso mediante programa a una amplia gama de objetos de aplicaciones externas.
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Usar un Procedimiento DLL en una Aplicación.
« Respuesta #1 en: 13 Marzo 2005, 03:40 »

Usar un Procedimiento DLL en una aplicación.

Puesto que los procedimientos de los archivos DLL residen en archivos externos a la aplicación de Visual Basic, debe especificar dónde están ubicados los procedimientos e identificar los argumentos con los que se deben llamar. La instrucción Declare proporciona esta información. Una vez declarado un procedimiento de DLL, podrá usarlo en el código como si fuera un procedimiento nativo de Visual Basic.

Importante: Al llamar directamente a cualquier DLL desde Visual Basic, perderá las características de seguridad incorporadas del entorno de Visual Basic. Esto significa que aumentará el riesgo de fallos del sistema durante la comprobación o la depuración del código. Para minimizar este riesgo, debe prestar mucha atención a la forma en que declara los procedimientos del archivo DLL, pasa los argumentos y especifica los tipos. En todos los casos, guarde a menudo su trabajo. Las llamadas a los archivos DLL le ofrecen una eficacia excepcional, pero acusan los errores más que otras tareas de programación.

En el ejemplo siguiente se muestra cómo debe llamar a un procedimiento desde la API de Windows. La función llamada SetWindowText modifica el título de un formulario. En la práctica, siempre se modifican los títulos con la propiedad Caption de Visual Basic, pero este ejemplo ofrece una manera sencilla de declarar y llamar a un procedimiento.

Declarar un procedimiento de DLL

El primer paso consiste en declarar el procedimiento en la sección Declaraciones de un módulo:

Código:
Private Declare Function SetWindowText Lib "user32" _
Alias "SetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String) As Long

Puede encontrar la sintaxis exacta de un procedimiento mediante la aplicación Visor de API o en el archivo Win32api.txt. Si coloca la instrucción Declare en un módulo de formulario o de clase, debe ir detrás de la palabra clave Private. Sólo puede declarar un procedimiento de DLL por proyecto; después podrá llamarlo todas las veces que desee.

Llamar a un procedimiento de DLL
Después de declarar la función, la llamará de la misma forma en que llamaría a una función estándar de Visual Basic. En este ejemplo se ha adjuntado el procedimiento al evento Form Load:

Código:
Private Sub Form_Load()
   SetWindowText Form1.hWnd, "Bienvenidos a VB"
End Sub

Al ejecutar este código, la función usará primero la propiedad hWnd para identificar la ventana cuyo título desea modificar (Form1.hWnd) y luego cambiará el texto de ese título a "Bienvenidos a VB".

Recuerde que Visual Basic no puede comprobar que está pasando los valores correctos a un procedimiento de DLL. Si pasa valores que no son correctos, el procedimiento puede fallar, lo que puede hacer que se interrumpa la aplicación de Visual Basic. Si esto ocurre, debe volver a cargar la aplicación y volver a iniciarla. Tome las debidas precauciones cuando experimente con procedimientos de DLL y guarde su trabajo a menudo.

Nota: Pocas llamadas a la API reconocen el tipo de datos Variant predeterminado. Sus llamadas serán más robustas si declara variables de tipos específicos y utiliza Option Explicit.
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Tener Acceso a la API de Windows
« Respuesta #2 en: 13 Marzo 2005, 03:41 »

Tener acceso a la API de Windows

Puede tener acceso a la API de Windows (o a otras DLL externas) si declara los procedimientos externos dentro de la aplicación de Visual Basic. Después de declarar un procedimiento, podrá usarlo como cualquier otra característica del lenguaje del producto.

Los procedimientos externos más utilizados son los que forman el entorno Microsoft Windows propiamente dicho. La API de Windows contiene miles de funciones, procedimientos, tipos y constantes que puede declarar y usar en sus proyectos. No obstante, estos procedimientos están escritos en lenguaje C, por lo que debe declararlos antes de usarlos con Visual Basic. Las declaraciones de procedimientos de DLL pueden ser bastante complejas. Aunque puede convertirlas usted mismo, la manera más sencilla de tener acceso a la API de Windows es usar las declaraciones predefinidas que se incluyen en Visual Basic.

El archivo Win32api.txt, ubicado en el subdirectorio \Winapi del directorio principal de Visual Basic, contiene declaraciones para muchos de los procedimientos de la API de Windows que se utilizan normalmente en Visual Basic. Para usar una función, un tipo u otra característica de este archivo, basta con copiarla al módulo de Visual Basic. Puede ver y copiar procedimientos del archivo Win32api.txt mediante la aplicación Visor de API o cargando el archivo en cualquier editor de textos.


Usar la aplicación Visor de API.

La aplicación Visor de API le permite desplazarse por las declaraciones, constantes y tipos incluidos en cualquier archivo de texto o en la base de datos de Microsoft Jet. Después de encontrar el procedimiento que desee, puede copiar el código al Portapapeles y pegarlo en la aplicación de Visual Basic. Puede agregar tantos procedimientos como quiera a su aplicación.


Para visualizar un archivo de la API:

* Desde el menú Complementos, abra el Administrador de complementos y cargue el Visor de API.

* Haga clic en el comando de menú Visor de API desde el menú Complementos.

* Abra el texto o el archivo de base de datos que quiera visualizar.

---> Para cargar un archivo de texto en el visor, seleccione el comando de menú Cargar archivo de texto desde el menú Archivo y elija el archivo que quiera visualizar.

---> Para cargar un archivo de base de datos, seleccione el comando de menú Cargar archivo de base de datos desde el menú Archivo.

* Seleccione el tipo de elemento que quiera visualizar desde la lista Tipos de API.

Nota: El Visor de API puede mostrar automáticamente cuándo comienza el último archivo que visualizó seleccionando el comando Cargar último archivo desde el menú Ver.


Para agregar procedimientos a su código de Visual Basic:

* Haga clic en el procedimiento que quiera copiar en la lista Elementos disponibles.

* Haga clic en Agregar. El elemento aparece en la lista de Elementos seleccionados.

* Indique el alcance del elemento haciendo clic en Public o Private en el grupo Alcance de declaración.

* Para quitar una entrada del cuadro de lista Elementos seleccionados, haga clic en el elemento y en el botón Quitar.

* Para quitar todas las entradas desde el cuadro de lista Elementos seleccionados, haga clic en Borrar.


Para copiar los elementos seleccionados al Portapapeles:

* Haga clic en Copiar. Se copiarán todos los elementos en la lista Elementos seleccionados.

* Abra su proyecto de Visual Basic y vaya al módulo en el que desee colocar la información de la API.

* Coloque el punto de inserción donde desee pegar las declaraciones, las constantes o los tipos y después elija Pegar en el menú Edición.


Convertir archivos de texto a archivos de base de datos Jet:

Para optimizar la velocidad, puede convertir el archivo Win32api.txt a un archivo de base de datos Jet, ya que es más rápido mostrar la lista al abrir una base de datos que al abrir un archivo de texto.

Para convertir un archivo de texto a un archivo de base de datos Jet:

* Inicie la aplicación Visor de API.

* Elija el comando Cargar archivo de texto del menú Archivo y abra el archivo .txt que desee convertir.

* Elija el comando Convertir texto a una base de datos del menú Archivo.

* Elija el nombre del archivo y la ubicación de su archivo de base de datos. A continuación haga clic en Aceptar.


Cargar automáticamente archivos de API desde la línea de comandos:

Puede especificar un archivo de texto o de base de datos para Apilod32.exe en la línea de comandos para cargar automáticamente el archivo al iniciar el Visor de API. Emplee la sintaxis siguiente para cargar el archivo elegido al iniciar el Visor de API:

Código:
Apilod32.exe {/T|/D} nombreArchivo

Argumento ---> Descripción
/T ---> El Visor de API cargará el archivo como un archivo de texto. Escriba /T en mayúsculas.
/D ---> El Visor de API cargará el archivo como un archivo de base de datos. Escriba /D en mayúsculas.
nombreArchivo La ruta de acceso del archivo que desea abrir.


Debe haber un espacio entre /T o /D y el argumento nombreArchivo. Si el archivo no se encuentra, aparecerá un mensaje de error. Si especifica un archivo que no es un archivo de texto o de base de datos, aparecerá un mensaje de error al intentar cargarlo.

Sugerencia: Puede visualizar un mensaje que muestra la sintaxis de los parámetros de la línea de comandos mediante la utilización de una ventana DOS y desplazarse por el directorio que tiene instalada la aplicación Visor de API. Para ello escriba apiload /?.

Ver el archivo Win32api.txt con un editor de texto

También puede cargar el archivo Win32api.txt en un editor de texto, como Microsoft Word o WordPad, para encontrar los procedimientos que desea usar. De nuevo, basta con copiar los procedimientos desde el archivo a un módulo de Visual Basic para usarlos en la aplicación.

Sugerencia: No cargue el archivo Win32api.txt en un módulo. Es un archivo grande y consumirá mucha memoria en su aplicación. Normalmente sólo usará unas pocas declaraciones en el código, por lo que es mucho más eficiente copiar de forma selectiva las declaraciones que necesite.

Usar procedimientos de otros orígenes
Si intenta llamar a un procedimiento de DLL que no forma parte del sistema operativo, debe determinar la declaración correcta para el mismo. En el tema "Declarar un procedimiento de DLL" se explica en detalle la sintaxis de la instrucción Declare.

Nota: Si utiliza Visual C++ (u otra herramienta similar) para crear archivos DLL a los que llamará Visual Basic, emplee la convención de llamadas __stdcall. No utilice la convención de llamadas predeterminada (_cdecl).
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Declarar un Proceso de DLL
« Respuesta #3 en: 13 Marzo 2005, 03:47 »

Declarar un proceso de DLL.

Aunque Visual Basic proporciona un amplio conjunto de declaraciones predefinidas en el archivo Win32api.txt, tarde o temprano querrá saber cómo puede crearlas por sí mismo. Por ejemplo, es posible que desee tener acceso a procedimientos de DLL creados en otros lenguajes o volver a escribir declaraciones predefinidas de Visual Basic para adaptarlas a sus necesidades.

Para declarar un procedimiento de DLL, agregue una instrucción Declare a la sección Declaraciones de la ventana del código. Si el procedimiento devuelve un valor, escriba la declaración como Function:

Declare Function nombrePúblico Lib "nombreBiblioteca" [Alias "alias"] [([[ByVal] variable [As tipo] [,[ByVal] variable [As tipo]]...])] As Type

Si el procedimiento no devuelve ningún valor, escriba la declaración como Sub:

Declare Sub nombrePúblico Lib "nombreBiblioteca" [Alias "alias"] [([[ByVal] [/i]variable[/i] [As tipo] [,[ByVal] variable [As tipo]]...])]

De forma predeterminada, los procedimientos de DLL declarados en módulos estándar son públicos y se pueden llamar desde cualquier parte de la aplicación. En cambio, los procedimientos de DLL declarados en otro tipo de módulo son privados para ese módulo y debe identificarlos como tales, precediendo la declaración con la palabra clave Private.

Los nombres de los procedimientos distinguen mayúsculas y minúsculas en las versiones de 32 bits de Visual Basic. En las versiones anteriores, de 16 bits, no las distinguían.


Especificar la biblioteca.

La cláusula Lib de la instrucción Declare indica a Visual Basic dónde puede encontrar el archivo .dll que contiene el procedimiento. Si hace referencia a una de las bibliotecas comunes de Windows (User32, Kernel32 o GDI32), no necesita incluir la extensión del archivo:

Código:
Declare Function GetTickCount Lib "kernel32" Alias _
"GetTickCount" () As Long

Para otras DLL, la cláusula Lib es la especificación de un archivo que puede incluir una ruta de acceso:

Código:
Declare Function lzCopy Lib "c:\windows\lzexpand.dll" _
(ByVal S As Integer, ByVal D As Integer) As Long

Si no especifica una ruta de acceso para nombreBiblioteca, Visual Basic buscará el archivo en el orden siguiente:

* Directorio que contiene el archivo .exe

* Directorio actual

* Directorio del sistema de Windows (a menudo, pero no necesariamente, \Windows\System)

* Directorio de Windows (no necesariamente \Windows)

* Variable de entorno de la ruta de acceso.


En la tabla siguiente se muestran los archivos de bibliotecas comunes del entorno operativo:

Biblioteca de vínculo
dinámico -----------------> Descripción.
Advapi32.dll ---> Biblioteca de servicios avanzados de la API que admite múltiples API, incluidas muchas llamadas de seguridad y del Registro.
Comdlg32.dll ---> Biblioteca de la API de diálogos comunes.
Gdi32.dll ---> Biblioteca de la API para dispositivos gráficos.
Kernel32.dll ---> Soporte común de la API base de 32 bits de Windows.
Lz32.dll ---> Rutinas de compresión de 32 bits.
Mpr.dll ---> Biblioteca de enrutadores de múltiples proveedores.
Netapi32.dll ---> Biblioteca de la API para redes de 32 bits.
Shell32.dll ---> Biblioteca de la API para Shell de 32 bits.
User32.dll ---> Biblioteca de rutinas para interfaces de usuario.
Version.dll ---> Biblioteca de versiones.
Winmm.dll ---> Biblioteca multimedia de Windows.
Winspool.drv ---> Interfaz de cola de impresión que contiene las llamadas de la API a la cola de impresión.


Trabajar con procedimientos de la API de Windows que utilizan cadenas.

Si trabaja con procedimientos de la API de Windows que utilizan cadenas, debe agregar una cláusula Alias a las instrucciones Declare para especificar el juego de caracteres correcto. En realidad, las funciones de la API de Windows que contienen cadenas pueden tener dos formatos: ANSI y Unicode. Por tanto, en los archivos de encabezado de Windows podrá ver las versiones ANSI y Unicode de cada función que contiene una cadena.

Por ejemplo, a continuación se muestran las dos descripciones del lenguaje C para la función SetWindowText. Observe que la primera descripción define la función como SetWindowTextA, donde la "A" final la identifica como una función ANSI:

Código:
WINUSERAPI
BOOL
WINAPI
SetWindowTextA(
   HWND hWnd,
   LPCSTR lpString);[/b]

La segunda descripción define la función como SetWindowTextW, donde la "W" final la identifica como una función amplia (wide) o Unicode:

Código:
WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
   HWND hWnd,
   LPCWSTR lpString);

Puesto que ninguna de las funciones se llama en realidad "SetWindowText," debe agregar una cláusula Alias a la declaración para indicar la función a la que desea hacer referencia:

Código:
Private Declare Function SetWindowText Lib "user32" _
Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal _
lpString As String) As Long

Observe que la cadena que sigue a la cláusula Alias debe ser el nombre verdadero del procedimiento (con minúsculas y mayúsculas).

Importante: Para las funciones de la API que utiliza en Visual Basic, debe especificar la versión ANSI de una función, ya que las versiones Unicode sólo son compatibles con Windows NT, no con Windows 95. Utilice las versiones Unicode sólo si sabe con seguridad que las aplicaciones se van a ejecutar sólo en sistemas basados en Windows NT.


Pasar argumentos por valor o por referencia.

De forma predeterminada, Visual Basic pasa todos los argumentos por referencia. Esto significa que, en lugar de pasar el valor real del argumento, Visual Basic pasa una dirección de 32 bits donde se almacena el valor. Aunque no necesita incluir la palabra clave ByRef en las instrucciones Declare, puede que desee hacerlo para documentar cómo se pasan los datos.

Muchos procedimientos de DLL esperan que se pasen los argumentos por valor. Esto implica que esperan el valor real, en lugar de su ubicación en la memoria. Si pasa un argumento por referencia a un procedimiento que espera un argumento por valor, el procedimiento recibirá datos incorrectos y no funcionará correctamente.

Para pasar un argumento por valor, coloque la palabra clave ByVal delante de la declaración del argumento en la instrucción Declare. Por ejemplo, el procedimiento InvertRect acepta el primer argumento por valor y el segundo por referencia:

Código:
Declare Function InvertRect Lib "user32" Alias _
"InvertRectA" (ByVal hdc As Long, _
lpRect As RECT) As Long

También puede usar la palabra clave ByVal al llamar al procedimiento.

Nota: Si consulta la documentación sobre procedimientos de DLL que utilizan la sintaxis del lenguaje C, recuerde que C pasa todos los argumentos, excepto las matrices, por valor.

Los argumentos de cadena son un caso especial. Pasar una cadena por valor significa que está pasando la dirección del primer byte de datos de la cadena. En cambio, si pasa una cadena por referencia, lo que está haciendo es pasar la dirección de la memoria donde está almacenada otra dirección; la segunda dirección es la que hace referencia realmente al primer byte de datos de la cadena. Para determinar qué enfoque debe usar, vea el tema "Pasar cadenas a un procedimiento de DLL", más adelante en este capítulo.


Nombres no estándar.

Ocasionalmente, los procedimientos de DLL tienen un nombre que no es un identificador válido. Puede que el nombre tenga un carácter que no es válido (por ejemplo, un guión) o puede que coincida con una palabra clave de Visual Basic (por ejemplo, GetObject). En este caso, utilice la palabra clave Alias para especificar el nombre del procedimiento no válido.

Por ejemplo, algunos procedimientos de los archivos DLL del entorno operativo comienzan con un carácter de subrayado. Aunque puede emplear este carácter en identificadores de Visual Basic, no puede comenzarlos con él. Para usar uno de estos procedimientos, primero debe declarar la función con un nombre válido y después usar la cláusula Alias para hacer referencia al nombre real del procedimiento:

Código:
Declare Function lopen Lib "kernel32" Alias "_lopen" _
(ByVal lpPathName As String, ByVal iReadWrite _
As Long) As Long

En este ejemplo, lopen es el nombre del procedimiento al que se hace referencia en los procedimientos de Visual Basic. El nombre _lopen es el nombre reconocido en el archivo DLL.

También puede usar la cláusula Alias para cambiar el nombre de un procedimiento siempre que sea conveniente. Si escribe otros nombres para los procedimientos (por ejemplo, utiliza WinDir para GetWindowsDirectoryA), asegúrese de que documenta en detalle los cambios para poder actualizar posteriormente el código.


Usar números ordinales para identificar procedimientos de DLL.

Además de un nombre, todos los procedimientos de DLL se pueden identificar por un número ordinal que especifica el procedimiento. Algunas DLL no incluyen los nombres de sus procedimientos y requieren la utilización de números ordinales para declarar los procedimientos que contienen. Emplear números ordinales consume menos memoria en la aplicación terminada y es más rápido que identificar los procedimientos de DLL por el nombre.

Importante: El número ordinal de una API específica será diferente con distintos sistemas operativos. Por ejemplo, el valor ordinal para GetWindowsDirectory es 432 bajo Win95, pero cambia a 338 bajo Windows NT 4.0. En definitiva, si espera ejecutar sus aplicaciones bajo distintos sistemas operativos, no utilice números ordinales para identificar los procedimientos de la API. Este enfoque puede ser también útil en el caso de procedimientos que no pertenecen a la API o en aplicaciones con una distribución muy controlada.

Para declarar un procedimiento de DLL por número ordinal, utilice la cláusula Alias con una cadena que contenga el carácter de signo numérico (#) y el número ordinal del procedimiento. Por ejemplo, el número ordinal de la función GetWindowsDirectory tiene el valor 432 en el núcleo de Windows; puede declarar el procedimiento del archivo DLL de la manera siguiente:

Código:
Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "#432" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long

Observe que puede especificar cualquier nombre válido para el procedimiento en este caso, ya que Visual Basic emplea el número ordinal para buscar el procedimiento en el archivo DLL.

Para obtener el número ordinal de un procedimiento que desea declarar, puede usar una herramienta, como Dumpbin.exe, para examinar el archivo .dll. (Dumpbin.exe es una herramienta incluida en Microsoft Visual C++.) Mediante la ejecución de Dumpbin en un archivo .dll, puede extraer información como listas de funciones incluidas en el archivo DLL, sus números ordinales y otros datos sobre el código.


Tipos de argumentos flexibles.

Algunos procedimientos de DLL pueden aceptar más de un tipo de datos para el mismo argumento. Si necesita pasar más de un tipo de datos, declare el argumento con la cláusula As Any para quitar restricciones de tipos.

Por ejemplo, puede pasar el tercer argumento de la siguiente declaración (lppt As Any) como una matriz de estructuras POINT o como una estructura RECT, según sus necesidades:

Código:
Declare Function MapWindowPoints Lib "user32" Alias _
"MapWindowPoints" (ByVal hwndFrom As Long, _
ByVal hwndTo As Long, lppt As Any, _
ByVal cPoints As Long) As Long

Aunque la cláusula As Any ofrece flexibilidad, también presenta riesgos ya que desactiva toda la comprobación de tipos. Sin esta comprobación, es probable que llame al procedimiento con el tipo equivocado, lo que puede tener como resultado varios problemas, entre ellos un error de la aplicación. Asegúrese de comprobar detenidamente los tipos de todos los argumentos si utiliza la cláusula As Any.

Si quita las restricciones de tipos, Visual Basic supondrá que el argumento se pasa por referencia. Incluya ByVal en la llamada real al procedimiento para pasar los argumentos por valor. Las cadenas se pasan por valor, por lo que se pasa un puntero a la cadena, en lugar de pasar un puntero a otro puntero. Para obtener más información al respecto, vea la sección "Pasar cadenas a un procedimiento de DLL".
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Pasar Matrices a un Procedimiento de DLL.
« Respuesta #4 en: 13 Marzo 2005, 03:50 »

Pasar matrices a un procedimiento de DLL

Puede pasar elementos individuales de una matriz de la misma manera que pasa una variable del mismo tipo. Si pasa un elemento individual, se pasará como el tipo base de la matriz. Por ejemplo, puede usar el procedimiento sndPlaySound para reproducir una serie de archivos .wav almacenados en una matriz:

Código:
Dim WaveFiles(10) As String
Dim i As Integer, worked As Integer
   For i = 0 to UBound(WaveFiles)
      worked = sndPlaySound(WaveFiles(i), 0)
   Next i

A veces, puede que desee pasar una matriz completa a un procedimiento de DLL. Si este procedimiento se creó específicamente para Automatización, puede pasar una matriz al procedimiento de la misma manera en que pasa una matriz a un procedimiento de Visual Basic: con paréntesis vacíos. Puesto que Visual Basic utiliza los tipos de datos de Automatización, incluido el tipo SAFEARRAY, el archivo DLL tiene que estar escrito para adaptarse a Automatización para que pueda aceptar los argumentos de las matrices de Visual Basic. Para obtener más información al respecto, vea la documentación del archivo DLL específico.

Si el procedimiento del archivo DLL no acepta directamente el tipo SAFEARRAY de Automatización, todavía puede pasar una matriz completa si es numérica. Para pasar una matriz numérica, debe pasar el primer elemento de la matriz por referencia. Este método funciona porque los datos de las matrices numéricas siempre se almacenan secuencialmente en memoria. Si pasa el primer elemento de una matriz a un procedimiento de DLL, ese archivo DLL tendrá acceso a todos los elementos de la matriz.

Como ejemplo, piense en cómo puede usar una llamada de la API para definir posiciones de tabulación dentro de un cuadro de texto. Hay posiciones de tabulación internas en los controles de cuadro de texto de múltiples líneas (pero no en los de una única línea). Si el texto del cuadro contiene tabulaciones (código de carácter 9), el texto que sigue a la tabulación se alineará con la siguiente posición de tabulación. Puede establecer la posición de estas posiciones de tabulación si llama a la función SendMessage de la API de Windows y pasa una matriz que contenga las posiciones de tabulación nuevas.

Código:
Private Declare Function SendMessageSetTabs Lib _
"user32" Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Const EM_SETTABSTOPS = &HCB

Sub ChangeTabs(anyText As TextBox, tabcount As Integer)
Dim i As Integer
Dim alngTabs() As Long
Dim lngRC As Long
ReDim alngTabs(tabcount - 1)
   For i = 0 To UBound(alngTabs)
      alngTabs(i) = (i + 1) * 96 
      ' Establece el valor para especificar tabulaciones
      ' en "unidades de diálogo".
   Next i
   ' Llama con un puntero nulo a las posiciones de
   ' tabulación vacías existentes.
   lngRC = SendMessageSetTabs(anyText.hwnd, _
   EM_SETTABSTOPS, 0, vbNullString)
   ' Pasa el primer elemento de la matriz;
   ' en la memoria le siguen otros elementos.
   lngRC = SendMessageSetTabs(anyText.hwnd, _
   EM_SETTABSTOPS, tabcount, alngTabs(0))
   anyText.Refresh
End Sub

Si llama a este procedimiento, debe especificar el nombre del cuadro de texto y el número de posiciones de tabulación que desea usar para la sangría. Por ejemplo:

Código:
Private Sub Command1_Click()
   ChangeTabs Text1, 4
End Sub
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Pasar tipos definidos por el usuario a un procedimiento de DLL.
« Respuesta #5 en: 13 Marzo 2005, 03:51 »

Pasar tipos definidos por el usuario a un procedimiento de DLL

Algunos procedimientos de DLL toman como argumentos los tipos definidos por el usuario. (Los tipos definidos por el usuario se denominan "estructuras" en C y "registros" en Pascal.) Como en el caso de las matrices, puede pasar los elementos individuales de un tipo definido por el usuario de la misma manera en que pasa variables numéricas o de cadena normales.

Puede pasar un tipo definido por el usuario completo como un único argumento si lo pasa por referencia. Los tipos definidos por el usuario no se pueden pasar por valor. Visual Basic pasa la dirección del primer elemento y los demás elementos se almacenan en memoria después del primer elemento. Según el sistema operativo que utilice, puede introducir caracteres de relleno.

Por ejemplo, varios procedimientos de los archivos DLL del entorno operativo aceptan un tipo definido por el usuario para el dibujo de un rectángulo, que tiene la siguiente estructura:

Código:
Type RECT
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type

Dos de los procedimientos que aceptan un rectángulo son DrawFocusRect, que dibuja un contorno de puntos alrededor del rectángulo especificado, e InvertRect, que invierte los colores del rectángulo especificado. Para usar estos procedimientos, coloque estas declaraciones en la sección Declaraciones de un módulo estándar:

Código:
Declare Function DrawFocusRect Lib "User32" Alias _
"DrawFocusRect" (ByVal hdc As Long, _
lpRect As RECT) As Long

Declare Function InvertRect Lib "User32" Alias _
"InvertRect" (ByVal hdc As Long, _
lpRect As RECT) As Long

Dim MouseRect As RECT

Ahora puede usar los siguientes procedimientos Sub para llamar a los archivos DLL:

Código:
Private Sub Form_MouseDown (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
   ScaleMode = 3
   If Button And 1 Then
      MouseRect.Left = X
      MouseRect.Top = Y
      MouseRect.Right = X
      MouseRect.Bottom = Y
   End If
End Sub

Private Sub Form_MouseUp (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
   ScaleMode = 3
   If Not (Button And 1) Then
      MouseRect.Right = X
      MouseRect.Bottom = Y
      InvertRect hDC, MouseRect
   End If
End Sub

Private Sub Form_MouseMove (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
   ScaleMode = 3
   If Button And 1 Then
      DrawFocusRect hDC, MouseRect
      MouseRect.Right = X
      MouseRect.Bottom = Y
      DrawFocusRect hDC, MouseRect
   End If
End Sub

Los tipos definidos por el usuario pueden contener objetos, matrices y cadenas BSTR, aunque la mayoría de los procedimientos de DLL que aceptan tipos definidos por el usuario no esperan que contengan datos de cadena. Si los elementos de la cadena son de longitud fija, parecerán cadenas terminadas en un carácter nulo para el archivo DLL y se almacenarán en memoria como cualquier otro valor. Las cadenas de longitud variable se incorporan a un tipo definido por el usuario como punteros a los datos de cadena. Se necesitan cuatro bytes para cada elemento de una cadena de longitud variable.

Nota: Si pasa a un procedimiento de DLL un tipo definido por el usuario con datos binarios, almacene estos datos en una variable de una matriz del tipo de datos Byte, en lugar de almacenarlos en una variable String. Se supone que las cadenas contienen caracteres y los datos binarios pueden no leerse correctamente en procedimientos externos si se pasan como una variable String.
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Pasar punteros de función a los procedimientos de DLL y a las bibliotecas de tip
« Respuesta #6 en: 13 Marzo 2005, 03:52 »

Pasar punteros de función a los procedimientos de DLL y a las bibliotecas de tipos.


Si está familiarizado con el lenguaje de programación C, conocerá ya los punteros de función. Si no es así, conviene explicar el concepto. Un puntero de función es una convención que permite pasar la dirección de una función definida por el usuario como argumento a otra función declarada para su uso en la aplicación. Mediante la utilización de punteros de función, puede llamar a funciones como EnumWindows para enumerar las ventanas abiertas del sistema o EnumFontFamilies para catalogar todas las fuentes actuales. También puede usarlas para tener acceso a otras muchas funciones de la API de Win32 no admitidas anteriormente en Visual Basic.

En Visual Basic existen varias limitaciones aplicables al uso de punteros de función. Para obtener información adicional al respecto, vea "Limitaciones y riesgos de los punteros de función", más adelante en este tema.


Descripción de los punteros de función.
El uso de punteros de función se ilustra mejor con un ejemplo. Para empezar, observe la función EnumWindows de la API de Win32:

Código:
Declare Function EnumWindows lib "user32" _
(ByVal lpEnumFunc as Long, _
ByVal lParam as Long ) As Long

EnumWindows es una función de enumeración, por lo que permite listar el controlador de cada una de las ventanas abiertas en el sistema. EnumWindows funciona llamando repetidamente a la función que se pasa al primer argumento (lpEnumFunc). Cada vez que EnumWindows llama a la función, le pasa el controlador de una ventana abierta.

Si llama a EnumWindows desde el código, pasa una función definida por el usuario a este primer argumento para controlar el flujo de valores. Por ejemplo, puede escribir una función para agregar los valores a un cuadro de lista, convertir los valores hWnd a nombres de ventanas o realizar cualquier otra acción.

Para especificar que está pasando una función definida por el usuario como argumento, debe preceder el nombre de la función con la palabra clave AddressOf. Puede pasar cualquier otro valor adecuado al segundo argumento. Por ejemplo, para pasar la función MyProc como argumento, puede llamar al procedimiento EnumWindows de la manera siguiente:

Código:
x = EnumWindows(AddressOf MyProc, 5)

La función definida por el usuario que especifica al llamar al procedimiento recibe el nombre de función de devolución de llamada. Estas funciones (o "devoluciones de llamadas", como se conocen normalmente) pueden realizar cualquier acción que especifique con los datos suministrados por el procedimiento.

Una función de devolución de llamada debe tener un conjunto de argumentos específicos, determinado por la API desde la que se hace referencia a la devolución de llamada. Para obtener más información acerca de los argumentos necesarios y cómo debe llamarlos, vea la documentación de la API.


Usar la palabra clave AddressOf.

Cualquier código que escriba para llamar a un puntero de función desde Visual Basic debe estar en un módulo .BAS estándar (no puede colocar el código en un módulo de clase ni adjuntarlo a un formulario). Si llama a una función declarada mediante la palabra clave AddressOf, deberá tener en cuenta las condiciones siguientes:

  • AddressOf sólo se puede usar inmediatamente antes de un argumento en una lista de argumentos; ese argumento puede ser el nombre de una función, una propiedad o un procedimiento definido por el usuario.
  • La propiedad, función o procedimiento al que llame con AddressOf debe encontrarse en el mismo proyecto que los procedimientos y declaraciones relacionadas.
  • Sólo puede usar la palabra clave AddressOf con funciones, propiedades o procedimientos definidos por el usuario. No puede usarla con funciones externas declaradas con la instrucción Declare ni con funciones a las que se hace referencia desde las bibliotecas de tipos.
  • Puede pasar un puntero de función a un argumento de tipo As Any o As Long en una definición declarada de un tipo definido por el usuario, una función o un procedimiento.

Nota: Puede crear sus propios prototipos de funciones de devolución de llamada con Visual C++ (u otras herramientas similares). Para trabajar con AddressOf, su prototipo debe usar la convención de llamadas __stdcall. La convención de llamadas predeterminada (_cdecl) no funcionará con AddressOf.


Almacenar un puntero de función en una variable.

Puede que algunas veces necesite almacenar un puntero de función en una variable intermedia antes de pasarlo al archivo DLL. Esto resulta útil si desea pasar punteros de función desde una función de Visual Basic a otra. Pero es necesario si llama a una función como RegisterClass, en la que necesita pasar el puntero mediante un argumento a una estructura (WndClass), que contiene un puntero de función como uno de sus elementos.

Para asignar un puntero de función a un elemento de una estructura, debe crear una función de empaquetador. Por ejemplo, en el código siguiente se crea la función de empaquetador FnPtrToLong, que permite colocar un puntero de función en cualquier estructura:

Código:
Function FnPtrToLong (ByVal lngFnPtr As Long) As Long
   FnPtrToLong = lngFnPtr
End Function

Para usar la función, declare primero el tipo y luego llame a FnPtrToLong. A continuación, pase la palabra clave AddressOf y la función de devolución de llamada para el segundo argumento.

Código:
Dim mt as MyType
mt.MyPtr = FnPtrToLong(AddressOf MyCallBackFunction)


Subclasificación.

La subclasificación es una técnica que le permite interceptar los mensajes de Windows enviados a un formulario o un control. Al interceptar estos mensajes, puede escribir su propio código para cambiar o extender el comportamiento del objeto. La subclasificación puede resultar compleja y explicarla en profundidad está fuera del alcance de este libro. El ejemplo siguiente ofrece una breve ilustración de esta técnica.

Importante: Si Visual Basic está en modo de interrupción, no podrá llamar a los métodos vtable ni a las funciones AddressOf. Como mecanismo de seguridad, Visual Basic devuelve simplemente 0 al usuario que ha llamado a una función AddressOf sin llamar a la función. En el caso de la subclasificación, esto significa que WindowProc devuelve 0 a Windows. Windows requiere valores devueltos distintos de 0 desde muchos de sus mensajes, por lo que el retorno de la constante 0 puede crear una situación de bloqueo entre Windows y Visual Basic, que le obligará a finalizar el proceso.

Esta aplicación está formada por un formulario sencillo con dos botones de comando. El código está diseñado para interceptar los mensajes de Windows enviados al formulario y para imprimir los valores de estos mensajes en la ventana Inmediato.

La primera parte del código está formada por las declaraciones de las funciones de la API, los valores de las constantes y las variables:

Código:
Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
   ByVal hwnd As Long, ByVal Msg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long

Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Const GWL_WNDPROC = -4
Global lpPrevWndProc As Long
Global gHW As Long

Seguidamente, dos subrutinas permiten al código interceptar el flujo de mensajes. El primer procedimiento (Hook) llama a la función SetWindowLong con el índice GWL_WNDPROC para crear una subclase de la clase de ventana utilizada para crear la ventana. A continuación, utiliza la palabra clave AddressOf con una función de devolución de llamada (WindowProc) para interceptar los mensajes e imprimir sus valores en la ventana Inmediato. El segundo procedimiento (Unhook) desactiva la subclasificación reemplazando la devolución de llamada por el procedimiento original de Windows.

Código:
Public Sub Hook()
   lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
   AddressOf WindowProc)
End Sub

Public Sub Unhook()
   Dim temp As Long
   temp = SetWindowLong(gHW, GWL_WNDPROC, _
   lpPrevWndProc)
End Sub

Function WindowProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As _
Long
   Debug.Print "Mensaje: "; hw, uMsg, wParam, lParam
   WindowProc = CallWindowProc(lpPrevWndProc, hw, _
   uMsg, wParam, lParam)
End Function

Finalmente, el código del formulario establece el valor inicial hWnd y el código de los botones llama simplemente a las dos rutinas:

Código:
Private Sub Form_Load()
   gHW = Me.hwnd
End Sub

Private Sub Command1_Click()
   Hook
End Sub

Private Sub Command2_Click()
   Unhook
End Sub



Limitaciones y riesgos de los punteros de función.

Trabajar con punteros de función puede ser desastroso. Siempre que llama a un archivo DLL puede perder la estabilidad del entorno de desarrollo de Visual Basic, pero si trabaja con punteros de función, puede resultar especialmente fácil provocar un fallo de la aplicación y perder el trabajo. Guarde a menudo su trabajo y haga copias de seguridad cuando sea necesario. A continuación se incluyen unas notas sobre algunas áreas que requieren una atención especial al trabajar con punteros de función:

  • Depuración. Si la aplicación activa una función de devolución de llamada mientras está en modo de interrupción, el código se ejecutará, pero se pasarán por alto todas las interrupciones y los pasos. Si esta función genera una excepción, puede capturarla y devolver el valor actual. En modo de interrupción no se permite restablecer si la función de devolución de llamada está en la pila.
  • Parcheos. El parcheado es la manera en que Windows activa el código reubicable. Si elimina una función de devolución de llamada en modo de interrupción, su parcheado se modifica para devolver 0. La mayoría de las veces, este valor será correcto, pero no siempre. Si elimina una función de devolución de llamada en modo de interrupción y luego la vuelve a escribir, es posible que algunos usuarios que llaman no sepan la nueva dirección. No se utilizan parcheados en el archivo .exe; el puntero se pasa directamente al punto de entrada.
  • Paso de una función con una firma incorrecta. Si pasa una función de devolución de llamada que toma un número de argumentos distinto al que espera el usuario o, por equivocación, llama a un argumento con ByRef o ByVal, puede que falle la aplicación. Tome las medidas adecuadas para pasar una función con la firma correcta.
  • Paso de una función a un procedimiento de Windows que ya no existe. Al subclasificar una ventana, pasa un puntero de función a Windows como el procedimiento de Windows (WindowProc). No obstante, si ejecuta la aplicación en el IDE, es posible que se llame a WindowProc después de haber destruido ya la función subyacente. Probablemente, esto provocará un fallo de protección general y puede bloquear el entorno de desarrollo de Visual Basic.
  • Los punteros de función "Basic a Basic" no se admiten. No se pueden pasar punteros de funciones de Visual Basic dentro del propio Visual Basic. Actualmente sólo se admiten punteros de Visual Basic a funciones de DLL.
  • Errores en procedimientos de devolución de llamada. Es importante que algunos errores en procedimientos de devolución de llamada no se propaguen hacia el procedimiento externo que le llamó inicialmente. Puede conseguirlo colocando una instrucción On Error Resume Next al comienzo del procedimiento de devolución de llamada.
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Pasar otro tipo de Información a Procesos de DLL.
« Respuesta #7 en: 13 Marzo 2005, 03:59 »

Pasar otro tipo de información a procedimientos de DLL.


Visual Basic admite un amplio intervalo de tipos de datos, algunos de los cuales pueden no ser admitidos por los procedimientos de determinadas bibliotecas de vínculo dinámico. En el tema siguiente se explica cómo tratar algunos de los casos especiales con los que puede encontrarse al usar variables de Visual Basic con procedimientos de DLL.


Pasar punteros nulos

A veces, algunos procedimientos de DLL pueden esperar recibir una cadena o un valor nulo como argumento. Si necesita pasar un puntero nulo a una cadena, declare el argumento As String y pase la constante vbNullString.

Por ejemplo, el procedimiento FindWindow puede determinar si se está ejecutando otra aplicación en el sistema. Acepta dos argumentos de cadena, uno para el nombre de clase de la aplicación y otro para el título de la barra de título de la ventana:

Código:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Cualquiera de estos argumentos se puede pasar como valor nulo. No obstante, no funciona pasar una cadena de longitud cero (""), ya que esto pasa un puntero a una cadena de longitud cero. El valor de este puntero no será cero. En su lugar, debe pasar un argumento con el valor verdadero de 0. La manera más sencilla de hacerlo es usar el valor de una constante vbNullString para el argumento apropiado:

Código:
hWndExcel = FindWindow(vbNullString, "Microsoft Excel")

Otra manera de controlar esta situación es volver a escribir la declaración para sustituir un tipo de datos Long para el argumento que desea pasar como nulo y luego llamar a ese argumento con el valor 0&. Por ejemplo:

Código:
Declare Function FindWindowWithNull Lib "user32" -
Alias "FindWindowA" (ByVal lpClassName As Long, _
ByVal lpWindowName As String) As Long

Código:
hWndExcel = FindWindow(0&, "Microsoft Excel")


Pasar propiedades

Las propiedades se deben pasar por valor. Si declara un argumento con ByVal, puede pasar directamente la propiedad. Por ejemplo, con este procedimiento puede determinar las dimensiones de la pantalla o la impresora en píxeles:

Código:
Declare Function GetDeviceCaps Lib "gdi32" Alias _
"GetDeviceCaps" (ByVal hdc As Long, _
ByVal nIndex As Long) As Long

También puede pasar a este procedimiento la propiedad hDC de un formulario o el objeto Printer para obtener el número de colores que admite la pantalla o la impresora seleccionada en ese momento. Por ejemplo:

Código:
Private Sub Form_Click ()
Const PLANES = 14, BITS = 12
   Print "Colores de la pantalla ";
   Print GetDeviceCaps(hDC, PLANES)* 2 ^ _
   GetDeviceCaps(hDC, BITS)
   Print "Colores de la impresora ";
   Print GetDeviceCaps(Printer.hDC, PLANES) * _
   2 ^ GetDeviceCaps(Printer.hDC, BITS)
End Sub

Para pasar una propiedad por referencia, debe usar una variable intermedia. Por ejemplo, suponga que desea emplear el procedimiento GetWindowsDirectory para establecer la propiedad Path de un control de cuadro de lista de archivos. El siguiente ejemplo no funcionará:

Código:
ReturnLength = GetWindowsDirectory(File1.Path,_
Len(File1.Path))

En su lugar, utilice el código siguiente para establecer la propiedad:

Código:
Dim Temp As String, ReturnLength As Integer
Temp = String(255, 0)
ReturnLength = GetWindowsDirectory(Temp, Len(Temp))
Temp = Left(Temp, ReturnLength)
File1.Path = Temp

Emplee esta técnica con propiedades numéricas si desea pasarlas a procedimientos de DLL que aceptan argumentos por referencia.


Usar controladores con DLL

Un controlador es un valor Long único definido por el entorno operativo. Puede usarlo para hacer referencia a objetos como formularios o controles. Los procedimientos de DLL del entorno operativo hacen un uso extensivo de los controladores: controladores de ventanas (hWnd), controladores de contextos de dispositivos (hDC), etc. Si un procedimiento toma un controlador como argumento, declárelo siempre como ByVal Long. Las funciones de DLL que devuelven un controlador se pueden declarar como funciones Long. Los controladores son números de identificador (Id.), no punteros ni valores numéricos; no intente nunca realizar operaciones matemáticas con ellos.

La propiedad hWnd de los formularios y los controles no gráficos, así como la propiedad hDC de los formularios y los controles de cuadros con imágenes, proporcionan controladores válidos que puede pasar a procedimientos de DLL. Al igual que cualquier otra propiedad pasada a un procedimiento de DLL, sólo se pueden pasar por valor.


Pasar tipos Variant

Pasar un argumento de tipo Variant es similar a pasar cualquier otro tipo de argumento, siempre y cuando el procedimiento del archivo DLL utilice la estructura de datos VARIANT de Automatización para tener acceso a los datos del argumento. Para pasar datos Variant a un argumento que no es de tipo Variant, páselos como ByVal.
Código:
En línea

-- - -^[NekroByte]^- - --
NekroByte

Desconectado Desconectado

Mensajes: 636


NekroByte++


Ver Perfil WWW
Tema Cerrado.
« Respuesta #8 en: 13 Marzo 2005, 04:04 »

Textos Extraidos de las Librerías de Microsoft Developer NetWork.

Dudas, comentarios, aclaraciones y consultas en otro hilo, en otro tema, en otra publicación, en otro post.

Tema cerrado.

Hilsener.
En línea

-- - -^[NekroByte]^- - --
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC
Free counter and web stats