Здравствуйте, Roman Odaisky, Вы писали:
ПС>>Можно явно запрашивать указатель на WinAPI-шную функцию с помощью GetProcAddress. Тогда программа будет работать и в старых версиях Windows.
RO>Э-э... А что, собственно, делать, если она их там не найдет?
Если WinAPI-шная функция отсутствует, то можно:
1. Выполнить fallback-код, например:
typedef COLORREF (WINAPI * PSetDCBrushColorProc)(HDC hDC, COLORREF Color);
static PSetDCBrushColorProc s_pSetDCBrushColor = NULL;
// вызывается в начале работы программы
void Init()
{
assert(s_pSetDCBrushColor == NULL);
HINSTANCE hLib = GetModuleHandle(L"gdi32.dll");
assert(hLib != NULL);
s_pSetDCBrushColor = reinterpret_cast<PSetDCBrushColorProc>(GetProcAddress(hLib, "SetDCBrushColor"));
}
#ifndef DC_BRUSH
#define DC_BRUSH 18
#endif
void PaintRect(HDC hDC, const RECT& Rect, COLORREF Color)
{
assert((Rect.left <= Rect.right) && (Rect.top <= Rect.bottom));
if (s_pSetDCBrushColor != NULL)
{
// начиная с Windows 98 и Windows 2000
(*s_pSetDCBrushColor)(hDC, Color);
HBRUSH b = static_cast<HBRUSH>(GetStockObject(DC_BRUSH));
FillRect(hDC, &Rect, b);
}
else
{
// старая Windows, fallback-код
HBRUSH hBrush = CreateSolidBrush(Color); // можно cache-ировать
if (hBrush == NULL)
{
throw runtime_error("Cannot create brush.");
}
FillRect(hDC, &Rect, hBrush);
DeleteObject(hBrush);
}
}
Так делает метод CMirrorFile::Close в MFC 6.0, он явно запрашивает функцию ReplaceFile из kernel32.dll.
2. Ничего не делать. Например, отсутствует функция HeapCompact. Значит не судьба ужать heap.
3. Заблокировать пункт меню или кнопку. Или не блокировать, а при нажатии показать сообщение «у вас старая Windows, возможность недоступна».