Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы

         

Файл wast\wast.cpp


// ====================================================== // Приложение WAST // ------------------------------------------------------ // Запуск приложений Windows из // командной строки MS-DOS // // Используется совместно с загружаемым драйвером // wastdrv.dll и VxD-драйвером VXDSRV.386 версии 1.1. // Запускается автоматически при загрузке Windows. // Автоматический запуск можно отменить, изменив // конфигурацию драйвера WASTDRVR при помощи приложения // Control Panel // ------------------------------------------------------ // Copyright (C) 1995 Александр Фролов, Сергей Ноженко // ====================================================== #define STRICT #include <windows.h>
#include <dir.h>

#include "wast.hpp"

BOOL InitApp(HINSTANCE);

static char szDriverName[] = "wastdrv.dll";

struct LOADPARMS { WORD segEnv; // среда LPSTR lpszCmdLine; // коммандная строка LPWORD lpwShow; // режим отображения LPWORD lpwReserved; // зарезервировано }; struct LOADPARMS parms;

WORD awShow[2] = { 2, SW_SHOW }; LPSTR lpszCmd, lpszParm; char szCurPath[128]; char szBuf[256]; // char szTempBuf[256];

// ====================================================== // Функция WinMain // ====================================================== #pragma argsused int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { if(hPrevInstance) // только одна копия приложения return FALSE;

// Открываем драйвер HDRVR hDriver = OpenDriver(szDriverName, NULL, NULL);

HTASK hTask;

if(hDriver) { // Получаем идентификатор текущей задачи hTask = GetCurrentTask();

// Регистрируем в драйвере текущую задачу BOOL rc = (BOOL)SendDriverMessage( hDriver, UDRV_REGISTERTASK, (LPARAM)hTask, NULL);

// Если не удалось зарегистрировать задачу, // виртуальный драйвер vxdsrv.386 не загружен if(!rc) { MessageBox(NULL, "Error Loading WAST\n" "Driver vxdsrv.386 not found", "Windows Application Starter", MB_OK | MB_ICONHAND);
return FALSE; } }






// Если не удалось открыть загружаемый драйвер, // выводим сообщение об ошибке else { MessageBox(NULL, "Error Loading WAST\n" "Driver wastdrv.dll not found", "Windows Application Starter", MB_OK | MB_ICONHAND);
return FALSE; }

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) { // Это сообщение посылается загружаемым драйвером // wastdrv.dll, когда VxD-драйвер фиксирует запуск // программы любой виртуальной машиной MS-DOS if (msg.message == WM_STARTWINAPP) { // Создаем и активируем временное невидимое окно, // переключая системную виртуальную машину из фонового // режима в основной режим HWND hDummyWnd = CreateWindow("static", "", WS_POPUP, 0, 0, 0, 0, HWND_DESKTOP, NULL, hInstance, NULL);

ShowWindow(hDummyWnd, SW_SHOW);
DestroyWindow(hDummyWnd);

// Адрес командной строки lpszCmd = (LPSTR)msg.lParam + 65;

// Адрес строки параметров lpszParm = (LPSTR)msg.lParam + 65 + 128;

// Устанавливаем текущий каталог setdisk(*LPSTR(msg.lParam));
szBuf[0] = *LPSTR(msg.lParam) + 'A'; szBuf[1] = ':'; szBuf[2] = '\\'; lstrcpy(szBuf + 3, LPSTR(msg.lParam) + 1);
chdir(szBuf);

// Готовим параметры для LoadModule lstrcpy(szBuf, (LPCSTR)" ");
lstrcat(szBuf, (LPCSTR)lpszParm);
*szBuf = (BYTE)lstrlen(lpszParm);

if(lstrlen(lpszParm) != 0) parms.lpszCmdLine = (LPSTR)szBuf; else parms.lpszCmdLine = (LPSTR)"";

parms.segEnv = 0; parms.lpwShow = (LPWORD) awShow; parms.lpwReserved = (LPWORD) NULL;

// Копируем командную строку и параметры // lstrcpy(szTempBuf, (LPSTR)msg.lParam + 65);
// lstrcat(szTempBuf, (LPSTR)msg.lParam + 65 + 128);

// Запускаем приложение Windows LoadModule(lpszCmd, &parms);

// WinExec(szTempBuf, SW_SHOW);
}

// Это сообщение поступает от загружаемого драйвера // при его удалении, выполняемом из приложения // Control Panel else if (msg.message == WM_UNLOADWAST) PostQuitMessage(0);
else DispatchMessage(&msg);
}

// Отменяем регистрацию текущей задачи SendDriverMessage(hDriver, UDRV_UNREGISTERTASK, (LPARAM)hTask, NULL);



// Закрываем драйвер CloseDriver(hDriver, NULL, NULL);

return msg.wParam; }

Первое, что делает функция WinMain - открывает загружаемый драйвер, вызывая для этого функцию OpenDriver.

Затем приложение получает идентификатор текущей задачи (т. е. свой идентификатор задачи), и регистрирует его в загружаемом драйвере, посылая тому сообщение UDRV_REGISTERTASK.

Далее запускается цикл обработки сообщений.

При обработке сообщения WM_STARTWINAPP выполняется запуск приложения Windows. Для быстрого переключения системной виртуальной машины из фонового режима в основной мы создаем окно с нулевыми размерами, а затем сразу же отображаем и удаляем его.

После этого запускаем приложение функцией LoadModule.

Вы можете также попробовать использовать для запуска функцию WinExec, для чего следует переставить соответствующим образом символы комментария.

При поступлении в очередь сообщения WM_UNLOADWAST работа приложения wast.exe завершается. Напомним, что это сообщение посылается приложению при удалении загружаемого драйвера.

Перед завершением своей работы приложение wast.exe отменяет регистрацию и закрывает загружаемый драйвер.

Все пользовательские сообщения определены в файле wast.hpp (листинг5.19).


Содержание раздела