Здравствуйте, 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.