Cómo implementar la programación Shell
El método de programación mencionado anteriormente para usar directamente algunas funciones del sistema operativo Windows es la programación para el shell del sistema operativo Windows. Algunas funciones del sistema operativo se pueden llamar a través de varias interfaces de programación proporcionadas por el sistema operativo. Incluso puedes modificar y ampliar algunas funciones de la aplicación según tus propias intenciones. Sin embargo, no hay mucha información en esta área y la mayor parte de lo que se dice no está claro. Además, es muy problemático utilizar métodos de programación ordinarios para realizar la programación de shell. Es necesario configurar objetos de estructura relacionados en todo momento. los miembros de datos en dicha estructura Hay tan solo una docena o hasta docenas, por lo que es muy engorroso de configurar Aquí hay una operación de shell relativamente simple: copiar archivos como ejemplo: ...
SHFILEOPSTRUCT FileOp; // Estructura de operación del archivo del Shell
FileOp.hwnd=m_hWnd; //Establece el identificador
//Establece el modo de operación, usa FO_COPY para copiar y FO_DELETE para eliminar
FileOp.wFunc =FO_COPY;
FileOp.pFrom=m_source; //Ruta del archivo de origen
FileOp.pTo=m_detect; //Ruta del archivo de destino
FileOp.fFlags= FOF_ALLOWUNDO; //Permitir recuperación
FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle //Establecer título
SHFileOperation(amp; FileOp); //Ejecutar copia de shell
if(FileOp.fAnyOperationsAborted) //Supervisar si se canceló
TRACE(¡Se canceló una operación! !!\n);
... Aunque el código anterior es efectivo cuando se implementa, es bastante problemático de implementar. Esta es solo una operación de shell relativamente simple para algunas operaciones de shell más complejas. La programación de la bandeja del sistema, la barra de tareas, etc. es particularmente seria, y para este tipo de programación, MFC no proporciona una biblioteca de clases de programas empaquetada, solo se proporciona la interfaz del programa de aplicación WinAPI del sistema, por lo que durante el proceso de desarrollo del programa, hay A menudo es una sensación de programación SDK.
COM (Modelo de objetos componentes) es un estándar binario y de red creado por Microsoft. También es un estándar de componentes que Microsoft promueve vigorosamente y ha obtenido un amplio reconocimiento. En el estándar COM, los objetos COM están bien encapsulados y los clientes no pueden acceder a los detalles de implementación de los objetos. El único método de acceso proporcionado a los usuarios es a través de la interfaz COM. La interfaz COM tiene dos significados: en primer lugar, es un conjunto de funciones que se pueden llamar para que el cliente pueda permitir que el objeto haga algo; en segundo lugar, la interfaz es la conexión entre el componente y el protocolo de su programa cliente; . Es decir, la interfaz no solo define qué funciones están disponibles, sino que también define qué debe hacer el objeto cuando se llaman estas funciones. Como objeto componente COM de gran tamaño, el propio sistema operativo Windows también proporciona algunas interfaces COM necesarias para los programas cliente, por lo que podemos programar directamente el shell de Windows a través de estas interfaces COM.
Antes de escribir y diseñar formalmente el programa, una cosa es segura: el programa necesita utilizar la interfaz COM y operar el objeto COM. Por lo tanto, primero debe agregar el código para inicializar COM y finalizar COM.
Generalmente, los códigos COM de inicialización y COM de terminación se agregan al comienzo de la función InitInstance() de la clase de aplicación y antes de regresar: ……
CoInitialize(NULL); //Inicializar COM
;...
CoUninitialize(); // Terminar el código COM
... Las dos funciones anteriores se pueden utilizar bien tanto en programas MFC como en programas que no son MFC. Además, si el marco del programa se basa en MFC, se puede lograr el mismo propósito simplemente llamando a la función AfxOleInit(). Y no es necesario llamar explícitamente al código que finaliza COM. En el estándar COM, la única forma de acceder a los objetos COM es la interfaz COM. Por lo tanto, al escribir un programa de shell para manipular el sistema Windows, primero debe obtener la interfaz COM proporcionada por él.
La interfaz COM utilizada es IShellDispatch, que se deriva de la interfaz IDispatch y se define en el archivo de encabezado VC98\Include\Exdisp.h en el directorio de instalación de VC. A continuación se muestran algunos extractos de las definiciones de interfaz que se utilizarán: ……<. /p >
EXTERN_C const IID IID_IShellDispatch;
#if definido(__cplusplus) amp;amp;!definido(CINTERFACE)
interfaz DECLSPEC_UUID(D8F015C0-C278-11CE-A49E -444553540000 )
IShellDispatch: Idispatch público
{
público:
……
virtual HRESULT STDMETHODCALLTYPE MinimizeAll( void) = 0;
virtual HRESULT STDMETHODCALLTYPE UndoMinimizeALL( void) = 0;
virtual HRESULT STDMETHODCALLTYPE FileRun( void) = 0;
virtual HRESULT STDMETHODCALLTYPE CascadeWindows (void) = 0;
virtual HRESULT STDMETHODCALLTYPE TileVertically( void) = 0;
virtual HRESULT STDMETHODCALLTYPE TileHorizontalmente( void) = 0;
virtual HRESULT STDMETHODCALLTYPE ShutdownWindows( void) = 0
virtual HRESULT STDMETHODCALLTYPE Suspend( void) =
virtual HRESULT STDMETHODCALLTYPE( void)
virtual HRESULT STDMETHODCALLTYPE TrayProperties( void) = 0
ayuda virtual HRESULT STDMETHODCALLTYPE( void)
virtual HRESULT STDMETHODCALLTYPE( void)
virtual HRESULT STDMETHODCALLTYPE FindComputer( void) = 0;
};
... Esta interfaz obtendrá un puntero al objeto COM cuando la función CoCreateInstance() lo cree. esta función, el cliente El programa puede evitar el trato explícito con fábricas similares. De hecho, la función también llama a la función CoGetClassObject () internamente para obtener la fábrica de clases del objeto COM. Sin embargo, encapsula el proceso de creación de objetos a través de la clase. factory El usuario solo necesita especificar la clase de objeto CLSID y el puntero de interfaz y el ID de interfaz que se generará. Obviamente, es muy conveniente crear un objeto COM directamente de esta manera. Después de obtener el puntero de objeto COM, puede usar esto.
Se utiliza un puntero para acceder y llamar a métodos en el objeto COM para implementar varias llamadas a funciones del shell de Windows. El siguiente es un código clave para implementar esta función: ……
HRESULT sc; //Devolver resultado
IShellDispatch *pShellDisp = NULL //Inicializar puntero de interfaz
<; p >//Crear objetos COM directamentesc = CoCreateInstance(CLSID_Shell, //Especifique el identificador del objeto COM que se creará
NULL, //Especifique la interfaz del objeto externo cuando puntero agregado
CLSCTX_SERVER, // Especifique la categoría del componente, puede especificar componentes en proceso, componentes fuera de proceso u objetos de control en proceso
IID_IDispatch, /. /Especifique el ID de la interfaz A lo que debe prestar atención es a esto Se refiere al ID de la interfaz del objeto COM que se creará
// en lugar del identificador de la interfaz del objeto de fábrica de clases
(LPVOID *) amp; pShellDisp); //Función de almacenamiento El puntero de interfaz del objeto devuelto
/* En el código anterior, CoCreateInstance primero llama a la función CoGetClassObject para crear un objeto de fábrica de clases. Luego usa el puntero de interfaz del objeto de fábrica de clases obtenido para crear un objeto COM real y finalmente coloca la fábrica de clases en El objeto se libera y devuelve, lo que protege efectivamente la fábrica de clases y facilita su uso por parte de los usuarios. */
if( FAILED(sc) )//FAILED o SUCCECCED deben usarse para determinar si el objeto COM se creó correctamente
return;
pShellDisp -gt; FindFiles(); //Llama al método en el objeto COM
pShellDisp-gt; //Libera el puntero de la interfaz aplicada
... pasar el puntero de la interfaz pShellDisp. Se llama al método FindFiles() del objeto COM para realizar la operación del shell del sistema para buscar archivos. De manera similar, el método de respuesta se puede llamar de manera flexible según las necesidades reales para realizar las operaciones de shell correspondientes. Existen principalmente los siguientes métodos: MinimizeAll: minimiza todas las ventanas, UndoMinimizeALL: restaura la minimización de ventanas, FileRun: ejecuta el menú de inicio..., CascadeWindows: Ventana en cascada, TileVertically: mosaico vertical, TileHorizontally: mosaico horizontal, ShutdownWindows: cerrar Windows, Suspender suspender computadora, SetTime: establecer tiempo, TrayProperties: propiedades de la barra de tareas, Ayuda de Windows: ayuda, FindFiles: buscar archivos, FindComputer: buscar computadora en espera.
Estas interfaces se definen en el archivo de encabezado VC98\Include\Exdisp.h en el directorio de instalación de VC. Puede escribir el código de operación del shell correspondiente viendo este archivo.