Autor Tema: SysCmd Indocumentado  (Leído 282 veces)

Desconectado xavi

  • Administrador
  • Habitual
  • *****
  • Mensajes: 181
SysCmd Indocumentado
« en: Mayo 26, 2020, 04:03:57 pm »
Palabras clave: SysCmd, oculto, indocumentado
Autor: Wayne Phillips
Extraído de: EverythingAccess.com

Rebuscando un tema, me he topado con esta página dónde se explican (por encima) algunas funciones de SysCmd no documentadas.

El artículo es muy antiguo (Abril 2005) pero es posible que algunas cosas continúen realmente ocultas.

(Traducción de Google Translate)
NOTA: lo copio y traduzco por si la página se pierde.


Funciones SysCmd no documentadas
por Wayne Phillips, 19 de abril de 2005 (para Access 97+)

Aquí hay algunos detalles sobre una selección de funciones SysCmd 'no documentadas'. Puede usarlos en sus aplicaciones de base de datos de Access para hacer cosas que generalmente no se pueden hacer fácilmente a través del Modelo de Objetos de Access (si es que lo hace).

Estos detalles provienen de varias fuentes, incluida mi propia investigación. Es probable que no sean 100% precisos y definitivamente no son oficiales ni compatibles con Microsoft: ¡ úselos bajo su propio riesgo!

SysCmd (603, strPathInputMdb, strPathOutputMde) - CONVERTIR MDB A MDE
Convierte un archivo MDB en un MDE. Dado que toma el archivo fuente como parámetro, no puede convertir la base de datos actualmente abierta usando Access VBA; en su lugar, debe llamar a esto desde otra aplicación / instancia:

 
    SysCmd 603, strPathInputMdb, strPathOutputMde

O, mediante el uso de la automatización (por ejemplo, en VB6):

        Dim objAccess As Object

        'Crear el objeto de Automatización de acceso
        Establecer objAccess = CreateObject ("Access.Application")

        ' Ahora llame a la función no documentada ...
        objAccess.SysCmd 602, strPathSourceMdb, strPathDestinationMdb

        Establecer objAccess = Nothing
Nota: debe asegurarse de estar utilizando la versión correcta de Access para crear el MDE (es decir, si es un archivo MDB de Access 2000, solo puede crear un MDE a partir de él utilizando Access 2000, no Access 2002/2003).

* ACTUALIZACIÓN * : parece que puede usar Access XP / 2003 para crear un archivo Access 2000 MDE con este método, sin embargo , tenga mucho cuidado ya que es muy probable que falle debido a las pequeñas diferencias en el código VBA compilado, las referencias y el acceso modelo de objeto, etc. Mi recomendación es olvidar que existe este agujero de bucle.

 *Comentario al pie*
   
Parece que la conversión a ADE o MDE con este método puede fallar si el origen y el destino se pasan como variables recargables.
Para forzar que estas variables pasen byval o desreferenciarlas, ajuste cada una en una llamada de función como VBA.Trim (sourcedb) etc.
por ejemplo:
app.SysCmd 603, VBA.Trim (sourceFile_), VBA.Trim (compiledFileName_ )

Esta fue mi experiencia al usar Access 2010 en Windows 7.
Si pasaba las variables directamente, un nombre de archivo unicode escalado aparecería en un directorio padre para el destdb y la función no encontraría el sourcedb si dejaba el sourcedb usando la variable directa.

Espero que esto ayude.

SysCmd (609) - OBTENER ID DE PROCESO DE LA INSTANCIA ACTUAL - MSACCESS.EXE - Solo Access 2000+
Devuelve el PID (ID de proceso) del proceso MSAccess.exe actualmente en ejecución. Esto sería muy útil para algunas llamadas a la API de Windows ...

 

SysCmd (504, Flag) - COMPILAR MÓDULOS VBA
Donde el indicador puede ser 16483 para indicar 'Guardar VBA con código compilado' o 16484 para 'Guardar VBA sin código compilado'.

Flag también puede ser 16481 y 16482, pero la funcionalidad es desconocida en la actualidad.

 

SysCmd (602, strPathSourceMdb, [strPathDestinationMdb]) - BASE DE DATOS COMPACTA - Solo Access 97
Compactar (no reparar) una base de datos. No puede compactar la base de datos * abierta * con este método; en su lugar, debe llamarla desde otra aplicación / instancia:

        Dim objAccess As Object

        'Create the Access Automation object
        Set objAccess = CreateObject ("Access.Application")

        ' Ahora llame a la función no documentada ...
        objAccess.SysCmd 602, strPathSourceMdb, strPathDestinationMdb

        Set objAccess = Nothing
Nota: Si desea compactar un archivo sin crear una 'copia' (es decir, compactar el archivo en su lugar), simplemente omita el parámetro strPathDestinationMdb.

 

SysCmd (555) - CREACIÓN DE FUERZA DE MSysIMEXSpecs Y MSysIMEXColumns
Las dos tablas que se utilizan para almacenar configuraciones de importación / exportación utilizadas por Access no se crean de forma predeterminada. Llamar a esta función los creará para usted.

 

SysCmd (500) - CONTEO DE REFERENCIAS VBA - Solo Access 97
El valor de retorno es el mismo que Access.References.Count.

 

SysCmd (501, intReferenceOrdinal) - CADENA ALMACENADA SIN PROCESAR DE REFERENCIAS VBA - Solo Access 97
Donde 0 <= intReferenceOrdinal <= SysCmd (500)

Para cada referencia de VBA, esto devolverá la cadena codificada que contiene todas las propiedades de referencia (# delimitador) (por ejemplo, GUID # MajorVersion # MinorVersion # LibraryPath # Name)

Algo así como '* \ G {00025E01-0000-0000-C000-000000000046} # 4.0 # 0 # C: \ Archivos de programa \ Archivos comunes \ Microsoft Shared \ DAO \ DAO350.DLL # Biblioteca de objetos Microsoft DAO 3.51'

 

SysCmd (605, strPathOutput) - CONVERTIR BASE DE DATOS PARA ACCEDER AL FORMATO 97 - Solo Access 2000+
Convierta la base de datos actual al formato Access 97. Si strPathOutput = 0, se solicita la ruta de salida.

En Access 2002/2003, esto es lo mismo que Access.ConvertAccessProject strSourcePath, strDestinationPath, acFileFormatAccess97

 

SysCmd (607, strProjectPath) - CONVERTIR A PROYECTO ADP SIN TABLAS / CONSULTAS  - Solo Access 2000+
Este comando crea un nuevo proyecto ADP e importa los componentes que no son Jet de la base de datos actualmente abierta (por ejemplo, formularios / informes / módulos vba).

Nota: Esto no es lo mismo que el Asistente de conversión, ya que no hace nada con las tablas o consultas.

 

SysCmd (608, intTipID) - VEA LOS CONSEJOS DEL ASISTENTE DE OFICINA COMO CADENAS - Solo Access 2000+
Estos son los consejos utilizados por el Asistente de Office, accesibles por número ordinal (0-60).

 

SysCmd (710, InputLocaleID) - CONFIGURAR EL TIPO DE TECLADO DE INSTANCIA DE APLICACIÓN
Esta llamada es un contenedor para la función Win32 API ActivateKeyboardLayout .

Esta configuración afecta solo a la instancia actual de la aplicación y no se guarda con la base de datos (deberá configurarla dentro de la rutina de inicio de sus aplicaciones para que sea semipermanente). El indicador de entrada se denomina 'identificador de configuración regional de entrada' (consulte los documentos de la API para obtener más información). Ejemplos de valores comunes (observe las repeticiones de palabras altas / bajas):

    InputLocaleID = & H08090809: británico

    InputLocaleID = & H04090409: inglés de EE. UU.

    InputLocaleID = & 04150415: polaco

    InputLocaleID = & 04190419: ruso

    InputLocaleID = & H04080408: griego

 

SysCmd (711) - OBTENGA EL TIPO DE TECLADO DE INSTANCIA DE APLICACIÓN
Esta llamada es un contenedor para la función Win32 API GetKeyboardLayout .

Este comando devuelve las aplicaciones InputLocaleID actual (solo instancia actual).   Consulte los indicadores del comando anterior (710).

 

SysCmd (714) - ¿HAY ALGUNOS OBJETOS DE ACCESO EN LA VISTA DE DISEÑO?
Devuelve un valor booleano (verdadero / falso): verdadero si algún formulario, informe, DAP, macro o módulo está actualmente abierto en modo de diseño.

 

SysCmd (715) - VERSIÓN DE CONSTRUCCIÓN DE ACCESS
Devuelve el número de compilación de la versión de Access que se está ejecutando. Combine este valor con la constante acSysCmdAccessVer SysCmd y luego podrá determinar el paquete de servicio, por ejemplo:

    SysCmd (acSysCmdAccessVer) = 9 -> Access 2000

        SysCmd (715) = 2719 'Access 2000 Sin Service Pack

        SysCmd (715) = 3822 'Access 2000 SP1

        SysCmd (715) = 4506 'Access 2000 SP2

        SysCmd (715) = 6620 'Access 2000 SP3

    SysCmd (acSysCmdAccessVer) = 10 -> Acceso 2002

        SysCmd (715) = 2627 'Access 2002 (XP) Sin Service Pack

        SysCmd (715) = 3409 'Access 2002 (XP) SP1

        SysCmd (715) = 4302 'Access 2002 (XP) SP2

        SysCmd (715) = 6501 'Access 2002 (XP) SP3

    SysCmd (acSysCmdAccessVer) = 11 -> Access 2003

        SysCmd (715) = 5614 'Access 2003 Sin Service Pack

        SysCmd (715) = 6355 'Access 2003 SP1

        SysCmd (715) = 6566 'Access 2003 SP2


 

SysCmd (712) - OBTENGA IPictureDisp DESDE EL CONTROL DE IMAGEN - Solo Access 2000+
Devuelve un puntero a la interfaz IPictureDisp detrás de un control de imagen.