Explicación detallada de la API de VBA

Cambios en la versión de Office

 Antes de office2010, Microsoft solo proporcionaba una versión de 32 bits, pero después de 2010 había dos versiones de Office, 32 bits y 64 bits. Este último puede manejar datos más grandes y se mejora la velocidad de ejecución del código VBA. La compatibilidad del código también se ha complicado, especialmente las declaraciones de API.
 Después de Office 2010, hay dos versiones de Office. Excel de 64 bits puede manejar datos más grandes y se ha mejorado el rendimiento. Con la introducción de 64 bits, también se introdujo una nueva versión de VBA o VBA 7. Puede ejecutarse en dos versiones al mismo tiempo. Al instalar office2010, la versión de instalación predeterminada es de 32 bits. Si necesita una versión de 64 bits, debe seleccionarla manualmente.
 En VBA 7, la versión anterior de la API debe volver a declararse para que se ejecute en 64 bits. El puntero de dirección y la declaración del identificador de ventana utilizados en la declaración deben actualizarse.

Versión del sistema Windows

 La oficina de 64 bits puede referirse a un espacio de direcciones de memoria más grande y usar más memoria física que antes. Además de hacer referencia al programa de aplicación para almacenar datos o almacenar instrucciones de código (punteros), la dirección también se puede utilizar para hacer referencia al identificador de la ventana mostrada. Determine el tamaño del puntero o identificador (en bytes) según se utilice el sistema de 32 bits o de 64 bits.

Al ejecutar Office de 64 bits, se enfrentará a dos problemas básicos:

  • El proceso nativo de 64 bits en la oficina no puede cargar archivos binarios de 32 bits. Cuando utilice controles ActiveX y complementos existentes, no serán compatibles.
  • VBA 7 no proporcionaba tipos de datos de puntero antes. Si los desarrolladores usan variables de 32 bits para almacenar punteros o identificadores, parte del valor se descarta cuando se usa el valor de 64 bits devuelto por la API definida por Declare.

Cambios en el código de VBA7

 VBA7 es una nueva base de código, reemplaza la versión anterior de VBA, es adecuada para Office de 32 y 64 bits. Proporciona dos constantes de compilación condicional: VBA7 y Win64.

Constante de VBA7:
 determina si la aplicación utiliza VBA7 o la versión anterior de VBA, para garantizar la compatibilidad con versiones anteriores del código.

Constante de Win64:
 determina si el código se ejecuta en forma de 32 bits o 64 bits.

Compatibilidad con ActiveX Control y complementos COM

 Los controles ActiveX de 32 bits existentes (incluidos los proporcionados por terceros y Microsoft) no son compatibles con la versión de 64 bits de Office. Para los controles ActiveX y los objetos Com, hay tres posibles soluciones:

  • Si el código fuente está disponible, se puede generar una versión de 64 bits.
  • Póngase en contacto con el proveedor para obtener actualizaciones.
  • Busque otras soluciones.

 El proceso nativo de 64 bits en Office no puede cargar archivos binarios de 32 bits. Incluyendo controles comunes de MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) y controles MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar), estos controles son instalados por Office anterior o el 32 actual -bit office, al migrar a Office de 64 bits, se deben reemplazar los controles existentes. Office de 64 bits no proporciona controles universales de 64 bits.

Compatibilidad con la interfaz API de Windows

 La biblioteca de tipos de VBA proporciona muchas funciones, pero a veces es necesario comunicarse directamente con el sistema operativo de la computadora y otros componentes, como cuando se administra la memoria y los procesos, o cuando se usa la interfaz de usuario o se modifica el registro. En estos escenarios de uso, el la mejor opción Es la función de salida de la biblioteca de vínculos dinámicos (DLL) incorporada. Utilice la declaración de Delcare para importar la función Dll en VBA.

La estructura de sintaxis de la declaración Delare es la siguiente, para ver si hay un tipo de retorno:

Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)

Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname"(argument list) As Type


 La función SubName o la función FunctionName reemplaza el nombre de la función exportada en la DLL. Si desea llamar a la versión ASCII o Unicode de la API, puede especificar el alias (AliasName). Lib es seguida por el nombre Dll donde se encuentra la función importada . La lista de parámetros debe contener lo mismo que la función exportada pasada a la DLL.
 La siguiente función de API abre una subclave en el registro de Windows y reemplaza su valor.

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

 Esta función está en la biblioteca de vínculos dinámicos de la API de Windows Advapi32.dll y su nombre de función es RegOpenKeyW. El prototipo se define de la siguiente manera:

LSTATUS RegOpenKeyW(HKEY    hKey,LPCWSTR lpSubKey,PHKEY   phkResult);

 En C y C ++, la API se puede compilar para 32 y 64 bits. Esto se debe a que HKEY se define como un puntero, que puede reflejar correctamente el tamaño de la memoria de la plataforma donde se encuentra el código compilado.
 En la versión anterior de VBA, no hay un tipo de datos de puntero específico, por lo que se usa el tipo de datos Long y el tipo Long es de 32 bits. Cuando se usa en un sistema con memoria de 64 bits, esta situación se interrumpe porque 32 bits Se pueden truncar o sobrescribir otras direcciones de memoria. Estas condiciones pueden provocar un comportamiento impredecible o fallas del sistema.
 Para resolver este problema, VBA ahora incluye un tipo de datos de puntero real LongPtr. Este nuevo tipo de datos puede escribir correctamente declaraciones de importación de API.

Declare PtrSafe Function RegOpenKeyW Lib "advapi32.dll" (ByVal hKey as LongPtr,ByVal lpSubKey as string,Byval phkResult as LongPtr) as Long

 El tipo de datos LongPtr y la función PtrSafe pueden declarar correctamente las funciones de importación de API en sistemas de 32 y 64 bits. La función PtrSafe indica al compilador de VBA que la declaración de declaración es verdadera para Office de 64 bits. Sin esta característica, la declaración Delcare provocará errores de compilación en sistemas de 64 bits. Tenga en cuenta que la instrucción PtrSafe es opcional en la naturaleza de 32 bits de Office. La siguiente tabla proporciona algunas descripciones de funciones y tipos de datos.

Tipo Articulo Descripción
Modificador PtrSafe Indica que la API es compatible con 64 bits, lo cual es necesario en sistemas de 64 bits.
Tipo de datos LongPtr No es un tipo de datos real, es un tipo de datos de 4 bytes (Long) en la versión de 32 bits y un tipo de datos de 8 bytes (LongLong) en la versión de 64 bits. Este es el método recomendado para declarar punteros y manejadores después de VBA 7. Solo es compatible con VBA7 de 32 y 64 bits.
Tipo de datos Largo largo El tipo de datos de 8 bytes solo está disponible en Office de 64 bits.
Operador de conversión CLngPtr Convierta la expresión al tipo LongPtr.
Operador de conversión CLngLng Convierta la expresión al tipo LongLong.
Función VarPtr Conversión de dirección de tipo de variante, devuelve LongPtr en 64 bits y tipo de datos Long en 32 bits.
Función ObjPtr Conversión de dirección de objeto, devuelve LongPtr en 64 bits y tipo de datos Long en 32 bits.
Función StrPtr Conversión de dirección de dirección de cadena, LongPtr se devuelve en 64 bits y el tipo de datos Long se devuelve en 32 bits.

 Nota: Las declaraciones de declaración de API sin características de PtrSafe se consideran incompatibles con Office de 64 bits.
 En resumen, hay dos constantes de compilación condicional: VBA7 y Win64. Para garantizar la compatibilidad con versiones anteriores de Office, puede usar las constantes VBA7 para evitar que se use código de 64 bits en versiones anteriores. Para diferentes códigos entre las versiones de 32 y 64 bits, como una API, que usa LongLong en la versión de 64 bits y usa Long en la versión de 32 bits, puede usar las constantes de Win64. Los siguientes ejemplos usan estas dos constantes:

#if Win64 Then
	Declare PtrSafe Function MyTestFunc Lib "DllName"(Byval N as LongLong) as LongLong
#else
	Declare  MyTestFunc Lib "DllName"(Byval N as Long) as Long
#End if

#if VBA7 then
	Declare PtrSafe Sub MessageBeep Lib "User32"(Byval N as Long)
#else
	Declare  Sub MessageBeep Lib "User32"(Byval N as Long)
#end if

 En resumen, si está escribiendo código de 64 bits y desea ser compatible con Office anterior, use las constantes de compilación condicional VBA7. Si está escribiendo código de Office de 32 bits, el código funciona igual que la versión anterior de Office, sin constantes de compilación condicional. Si desea escribir Office compatible de 32 y 64 bits, use Win64 para compilar constantes.

Utilice StrPtr, VarPtr, ObjPtr

 Utilice estas funciones para devolver punteros (direcciones de memoria) de tipos de cadenas, tipos de variantes y tipos de objetos.

Conocimientos básicos de la biblioteca de enlaces dinámicos

  Una biblioteca de vínculos dinámicos (DLL) es un módulo que contiene funciones y datos, que pueden ser utilizados por otro módulo o aplicación.
 DLL define dos funciones: función de exportación y función interna. Las funciones exportadas pueden ser utilizadas por otras aplicaciones y las funciones internas solo se utilizan internamente.
 La API de Windows es un conjunto de Dlls, cada módulo Dll exporta diferentes funciones para módulos externos.
 Cada proceso que carga Dll asigna Dll a su espacio de direcciones de memoria virtual Después de que el proceso carga Dll a su dirección virtual, el programa mejorado puede llamar a la función de exportación de Dll.

API de declaración de VBA

 Primero busque el prototipo de la función API en el sitio web oficial de Microsoft y luego importe la función de acuerdo con las reglas de sintaxis de VBA. Las siguientes funciones:

int MessageBox(
  HWND    hWnd,
  LPCTSTR lpText,
  LPCTSTR lpCaption,
  UINT    uType
);

 Las funciones de la API se definen en formato de lenguaje C. Si es un tipo de puntero, se define como un entero largo de VBA. Si es un puntero secundario, se define como cualquier tipo. Después de Office 2010, LongPtr se define para compatibilidad con tipos de punteros de 32 y 64 bits.
 Las funciones de API generalmente tienen dos versiones, ASCII y Unicode. El alias especifica una versión determinada. Se recomienda utilizar la versión Unicode y la función API que termina en W.

Office 2010 以后定义方式:
'选择VBA变量和C语言字节一致的变量,如 C的int是4Byte等同于VBA的long。VBA7以后多了一个LongPtr类型,在32位为Long类型在64位为LongLong类型。
#if VBA7 Then

public declare ptrSafe Function MessageBox lib "user32.dll" alias MessageBoxW _
(byval hWnd as LongPtr,byval lpText as string,byval lpCaption as string, byval uType as long) as long

#else

public declare  Function MessageBox lib "user32.dll" alias MessageBoxW _
(byval hWnd as Long,byval lpText as string,byval lpCaption as string, byval uType as long) as long

#end if
'上面定义一个Unicode版本的API,同时能兼容各个版本的Office。

 Pueden unirse al grupo para comunicarse juntos: 794568082.

Supongo que te gusta

Origin blog.csdn.net/qq_25686631/article/details/111191241
Recomendado
Clasificación