Любые переменные, объявленные вами в области действия
#pragma, определяющей сегмент данных, будут размещены в этом сегменте данных, при условии, что они инициализированы. Если вы не укажете инициализатор, переменные
будут размещены в сегменте данных по умолчанию, и #pragma не имеет силы.
ПРИМЕЧАНИЕ
В тот же момент оказывается, что эта
особенность не позволяет использовать массивы объектов C++ в разделяемом
сегменте данных, т.к. в C++ вы не можете инициализировать массив
пользовательских объектов (предполагается, что этим должны заниматься их
конструкторы по умолчанию). Это пересечение формальных требований C++ и
расширений Microsoft, требующих наличия инициализаторов, оказывается
фундаментальным ограничением.
|
Директива #pragma comment вызывает добавление
указанного ключа к командной строке компоновщика на этапе связывания. Вы могли
бы использовать Project | Settings в VC++ и изменить командную строку
компоновщика, однако трудно помнить про необходимость такого действия, когда вы
перемещаете код с места на место (и обычная ошибка - забыть выбрать All
Configurations при изменении установок и, таким образом, успешно отлаживать, но
получить сбой в конфигурации Release). Итак, я обнаружил, что лучше всего помещать
команду непосредственно в исходном файле. Заметим, что используемый текст
должен соответствовать синтаксису командного ключа компоновщика. Это означает, что вы не должны включать в указанный текст пробелы, иначе компоновщик не
обработает его должным образом.
Обычно вы предоставляете некоторый механизм для
установки дескриптора окна. Например,
void SetWindow(HWND w)
{
hWnd = w;
}
|
хотя эта операция, как я покажу далее, часто совмещена
с собственно установкой хука.
Пример: Мышиный Хук
заголовочный файл (myhook.h)
Здесь должны быть объявлены функции setMyHook и
clearMyHook, но это требование разъяснено в моем очерке The
Ultimate DLL Header File.
#define UWM_MOUSEHOOK_MSG
_T("UMW_MOUSEHOOK-"
"{B30856F0-D3DD-11d4-A00B-006067718D04}")
|
исходный файл (myhook.cpp)