Re[6]: Windows Vista программисту
От: Пётр Седов Россия  
Дата: 19.01.08 16:18
Оценка:
Здравствуйте, Sakura-chan, Вы писали:

SC>Отличные варианты. Хочу тока спросить по первому. У меня первая мысль была другая:


SC>
SC>hDLL = LoadLibrary ("библиотека.dll");
SC>WindowsXPfunc = (что-то)GetProcAddress (hDLL, "WindowsXPfunc"); // Функция с 2 параметрами
SC>if (!WindowsXPfunc) WindowsXPfunc = Dummy_2p;
SC>...
SC>void __stdcall Dummp_1p (int a) { return; }
SC>void __stdcall Dummp_2p (int a, int b) { return; }
SC>


SC>В таком способе есть какой недостаток?

Я не вижу здесь никаких недостатков. Например, так можно сделать с HeapCompact:
static UINT WINAPI HeapCompact_Fallback(HANDLE hHeap, DWORD dwFlags)
{
  // ничего не делать
  return 0;
}

typedef UINT (WINAPI * PHeapCompactProc)(HANDLE hHeap, DWORD dwFlags);
static PHeapCompactProc s_pHeapCompact = NULL;

// вызывается в начале работы программы
void Init()
{
  assert(s_pHeapCompact == NULL);
  HINSTANCE hLib = GetModuleHandle(L"kernel32.dll");
  assert(hLib != NULL);
  s_pHeapCompact = reinterpret_cast<PHeapCompactProc>(GetProcAddress(hLib, "HeapCompact"));
  if (s_pHeapCompact == NULL)
  {
    // старая Windows
    s_pHeapCompact = &HeapCompact_Fallback;
  }
}

LRESULT CALLBACK HandleMessage(HWND hWindow, UINT MessageType, WPARAM wParam, LPARAM lParam)
{
  switch (MessageType)
  {
  ...
  case WM_COMPACTING:
  {
    HANDLE hProcessHeap = GetProcessHeap();
    (*s_pHeapCompact)(hProcessHeap, /*dwFlags:*/0);
    return 0;
  }
  ...
  }
}


Но такой способ не всегда годится. Например, хочется сделать top-level окно непрямоугольной формы. Если user32.dll экспортирует функцию SetLayeredWindowAttributes, то лучше использовать её. Если она отсутствует, то придётся создать GDI-регион и назначить его окну вызовом функции SetWindowRgn.
Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.