- •Министерство образования и науки российской федерации
- •ОсобенностиWin32api
- •Расширение функциональности WinMain.
- •Класс окна
- •Создание окна
- •Расширение функциональности WndProc
- •С чего начать?
- •Операционная система x64
- •Как сделать код совместимым с Win64
- •Отладка
- •Заключение Приложения Приложение 1.
- •Приложение 2.
Отладка
И вот вы наконец добились чистой компиляции Win32- и x64-версий своего кода. Остался последний фрагмент головоломки - выполнение и отладка этого кода. Хотя вы скомпилировали свою x64-версию на компьютере с процессором x64, для отладки в режиме x64 понадобятся средства удаленной отладки, предоставляемые Visual Studio. К счастью, если вы работаете с Visual Studio IDE на 64-разрядной машине, IDE сама позаботится обо всех необходимых операциях. Если по какой-то причине вы не можете использовать удаленную отладку, остается лишь один вариант - взять x64-версию WinDbg.
Если вы никогда не пользовались удаленной отладкой, сильно волноваться не стоит. Как только вы ее настроите, она почти ничем не будет отличаться от локальной отладки.
Первый шаг - установка на целевой компьютер 64-разрядной MSVSMON. Обычно это делается с помощью программы RdbgSetup, поставляемой с Visual Studio. После запуска MSVSMON зайдите в меню Tools для настройки соответствующих параметров защиты соединения между вашей 32-разрядной Visual Studio и экземпляром MSVSMON.
Далее из Visual Studio сконфигурируйте свой проект на применение удаленной отладки x64-кода. И для начала откройте окно свойств проекта (рис. 4).
Рис. 4.Выбор платформы сборки
Убедитесь, что текущей является ваша 64-разрядная конфигурация, и выберите Debugging в разделе Configuration Properties. Ближе к верхней части вы увидите раскрывающийся список Debugger to launch. Его изначальное значение - Local Windows Debugger. Смените его на Remote Windows Debugger. Под этим списком вы можете задать удаленную команду (например, имя программы), которая должна выполняться в момент начала отладки, а также указать имя удаленного компьютера и тип соединения.
Если вы все правильно настроили, можете начинать отладку своего x64-приложения точно так же, как и Win32-программы. О соединении с MSVSMON свидетельствует строка "connected", которая появляется в трассировочном окне этой программы при каждом успешном подключении отладчика. С этого момента большинство операций выполняется так же, как и в хорошо известном вам отладчике Visual Studio. Не забудьте открыть окно регистров, чтобы увидеть все 64-битные регистры, а также заглянуть в окно дизассемблированного кода, чтобы посмотреть на такой знакомый, но все же слегка другой ассемблерный x64-код.
Заметьте, что 64-разрядный минидамп в отличие от 32-разрядного нельзя напрямую загрузить в Visual Studio. Вместо этого нужно использовать Remote Debugging. Кроме того, в настоящий момент Visual Studio 2005 не поддерживает отладку interop-вызовов между управляемым и неуправляемым 64-разрядным кодом.
Заключение Приложения Приложение 1.
#include <windows.h>
// объявление функций
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
//////////////////////////////////////////////////////////////////////////
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// имя будущего класса
LPCTSTR lpzClass = TEXT("My Window Class!");
// регистрация класса
if (!RegMyWindowClass(hInstance, lpzClass))
return 1;
// вычисление координат центра экрана
RECT screen_rect;
GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана
int x = screen_rect.right / 2 - 150;
int y = screen_rect.bottom / 2 - 75;
// создание диалогового окна
HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 300, 150, NULL, NULL,
hInstance, NULL);
// если окно не создано, описатель будет равен 0
if(!hWnd) return 2;
// цикл сообщений приложения
MSG msg = {0}; // структура сообщения
int iGetOk = 0; // переменная состояния
while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
{
if (iGetOk == -1) return 3; // если GetMessage вернул ошибку - выход
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam; // возвращаем код завершения программы
}
//////////////////////////////////////////////////////////////////////////
// функция регистрации класса окон
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)
{
WNDCLASS wcWindowClass = {0};
// адрес ф-ции обработки сообщений
wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;
// стиль окна
wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;
// дискриптор экземпляра приложения
wcWindowClass.hInstance = hInst;
// название класса
wcWindowClass.lpszClassName = lpzClassName;
// загрузка курсора
wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
// загрузка цвета окон
wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
return RegisterClass(&wcWindowClass); // регистрация класса
}
//////////////////////////////////////////////////////////////////////////
// функция обработки сообщений
LRESULT CALLBACK WndProc(
HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// выборка и обработка сообщений
switch (message)
{
case WM_LBUTTONUP:
// реакция на сообщение
MessageBox(hWnd, TEXT("Вы кликнули!"), TEXT("событие"), 0);
break;
case WM_DESTROY:
PostQuitMessage(0); // реакция на сообщение
break;
default:
// все сообщения не обработанные Вами обработает сама Windows
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}