Типовой код замены API в Microsoft Layer for Unicode


Нижеследующий типовой код демонстрирует, как заменить функцию LoadCursor в Microsoft Layer for Unicode.

// переадресуем объявление замены
HCURSOR __stdcall UserLoadCursorW(HINSTANCE hInstance, LPCWSTR lpCursorName);

// заменим
extern FARPROC Unicows_LoadCursorW = (FARPROC)&UserLoadCursorW;

HCURSOR __stdcall
UserLoadCursorW(HINSTANCE hInstance, LPCWSTR lpCursorName)
{
    // Преобразуем только реальные символьные строки, а не
    // пользовательские атомы или пустые указатели (NULLs)
    if ((ULONG_PTR)(lpCursorName) > 0xffff)
    {
        // Получим размер строки Unicode 
        size_t cchCursorName = wcslen(lpCursorName);

        // Назначим достаточное место для строки Ansi
        LPSTR lpCursorNameA = _alloca((cchCursorName + 1) * 2);

        // Преобразуем строку из Unicode
        WideCharToMultiByte(CP_ACP, 
                            0, 
                            lpCursorName, 
                            cchCursor, 
                            lpCursorNameA, 
                            cchCursor * 2, 
                            NULL, 
                            NULL);

        return(LoadCursorA(hInstance, lpCursorNameA);
    }
    else
    {
        // Это - не действительная строка, чтобы хорошо вызываться 
        // напрямую без преобразования этого параметра.
        return(LoadCursorA(hInstance, (LPSTR)lpCursorName);
    }
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz