Поделиться через


Функции программы-оболочки SHLWAPI

[Эти функции доступны в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003. Они могут быть изменены или недоступны в последующих версиях Windows.]

Таблицы в этом документе перечисляют функции-оболочки из Shlwapi.dll, которые предоставляют ограниченную функциональность Юникода для Windows 95, Windows 98 и Windows Millennium Edition (Windows Me).

Windows 95, Windows 98 и Windows Millennium Edition (Windows Me) называются здесь "собственными платформами ANSI". На собственных платформах ANSI эти функции-оболочки преобразуют входные строковые параметры Юникода в ANSI и вызывают версии функций ANSI в столбце Пересылаемые . Например, AppendMenuWrapW вызывает AppendMenuA, который является версией ANSI AppendMenu. Другие функции следуют той же схеме. Все строки, возвращаемые функцией ANSI, преобразуются в Юникод и возвращаются вызывающей приложению. Помимо исключений, отмеченных в столбце Примечания , функция-оболочка имеет тот же синтаксис и предоставляет те же функции, что и функция в столбце Forwards To . Подробные сведения об использовании см. на этой справочной странице.

Предупреждение системы безопасности: Несколько строк Юникода могут преобразоваться в одну и ту же строку ANSI. Непредвиденные конфликты после преобразования могут привести к непредвиденному поведению. Например, если CreateEventWrapW используется для создания двух событий с разными именами, имена которых совпадают после преобразования из Юникода в ANSI, второй вызов вернет дескриптор тому же событию, что и первый вызов, даже если исходные строки Юникода были другими.

Операционные системы Microsoft Windows NT, Windows 2000, Windows XP, Windows Server 2003 и более поздних версий называются собственными платформами Юникода. По большей части на собственных платформах Юникод эти функции-оболочки просто перенаправляет входные строковые параметры в версию функции в Юникоде в столбце Forwards To . Например, AppendMenuWrapW перенаправляет в AppendMenuW, который является версией в Юникоде AppendMenu. Другие функции следуют той же схеме. Все строки, возвращаемые функцией Юникод, возвращаются вызывающей приложению. Помимо исключений, отмеченных в столбце Примечания , функция-оболочка имеет тот же синтаксис и предоставляет те же функции, что и функция в столбце Forwards To . Подробные сведения об использовании см. на этой справочной странице.

Предупреждение системы безопасности: Проблемы безопасности, отмеченные для функций в столбце Forwards To , также относятся к соответствующим функциям-оболочкам. Дополнительные сведения см. в справочной документации по функции в столбце Forwards To .

Функции-оболочки в этой таблице содержатся в Shlwapi.dll. Для их вызова необходимо использовать порядковый номер, указанный в таблице.

Примечание

Эти функции-оболочки доступны в Windows XP, но не предоставляют функции-оболочки в Windows XP с пакетом обновления 2 (SP2) и более поздних версий. Они также не предоставляют функциональные возможности оболочки в Windows Server 2003. Вместо этого следует использовать функции, перечисленные в столбце Пересылаемые .

 

Функция Порядковый номер Пересылает на DLL Комментарии
AppendMenuWrapW 36 AppendMenu USER32 (a), (f), (Меню)
CallWindowProcWrapW 37 CallWindowProc USER32 (i)
CharLowerWrapW 38 CharLower KERNEL32 (e)
CharUpperBufWrapW 44 CharUpperBuff KERNEL32 (e)
CharUpperWrapW 43 CharUpper KERNEL32 (e)
CompareStringWrapW 45 CompareString KERNEL32 (CompareString)
CopyFileWrapW 112 CopyFile KERNEL32 (a), (c)
CreateEventWrapW 51 CreateEvent KERNEL32 (a)
CreateFileWrapW 52 CreateFile KERNEL32 (a), (c)
CreateWindowExWrapW 55 CreateWindowEx USER32 (a)
DefWindowProcWrapW 56 DefWindowProc USER32 (i)
DeleteFileWrapW 57 DeleteFile KERNEL32 (a), (c)
DialogBoxParamWrapW 59 DialogBoxParam USER32 (f), (i), (DialogBoxParam)
DispatchMessageWrapW 60 DispatchMessage USER32 (i)
DragQueryFileWrapW 318 DragQueryFile SHELL32 (b), (c), (g), (DragQueryFile)
DrawTextExWrapW 301 DrawTextEx USER32 (a), (d)
DrawTextWrapW 61 Drawtext USER32 (a)
ExtTextOutWrapW 299 ExtTextOut GDI32 (d), (f), (ExtTextOut)
FormatMessageWrapW 68 FormatMessage KERNEL32 (a), (g), (FormatMessage)
GetClassInfoWrapW 69 GetClassInfo USER32 (GetClassInfo)
GetDateFormatWrapW 311 GetDateFormat KERNEL32 (a), (g), (DateTime)
GetDlgItemTextWrapW 74 GetDlgItemText USER32 (g)
GetFileAttributesWrapW 75 GetFileAttributes KERNEL32 (a), (c)
GetLocaleInfoWrapW 77 GetLocaleInfo KERNEL32 (g)
GetMenuItemInfoWrapW 302 GetMenuItemInfo USER32 (f), (g), (MenuItemInfo)
GetModuleFileNameWrapW 80 GetModuleFileName KERNEL32 (c), (g)
GetModuleHandleWrapW 83 GetModuleHandle KERNEL32 (c), (g)
GetObjectWrapW 84 GetObject GDI32 (g)
GetOpenFileNameWrapW 403 GetOpenFileName COMDLG32 (a), (b), (g), (OpenFileName)
GetSaveFileNameWrapW 389 GetSaveFileName COMDLG32 (a), (b), (g), (OpenFileName)
GetSystemDirectoryWrapW 81 GetSystemDirectory KERNEL32 (c), (g)
GetTimeFormatWrapW 310 GetTimeFormat KERNEL32 (a), (g), (DateTime)
GetWindowLongWrapW 94 GetWindowLong USER32 (WindowLong)
GetWindowsDirectoryWrapW 97 GetWindowsDirectory KERNEL32 (c), (g)
GetWindowTextLengthWrapW 96 GetWindowTextLength USER32 (j)
GetWindowTextWrapW 95 GetWindowText USER32 (f), (g)
InsertMenuItemWrapW 98 InsertMenuItem USER32 (a), (f), (Menu), (MenuItemInfo)
IsCharAlphaWrapW 25 IsCharAlpha USER32 (e)
IsCharAlphaNumericWrapW 28 IsCharAlphaNumeric KERNEL32 (e)
IsCharUpperWrapW 26 IsCharUpper USER32 (e)
LoadLibraryWrapW 105 LoadLibrary KERNEL32 (a), (c)
LoadStringWrapW 107 LoadString KERNEL32 (e)
MessageBoxWrapW 340 Messagebox USER32 (a)
MoveFileWrapW 113 MoveFile KERNEL32 (a), (c)
OutputDebugStringWrapW 115 OutputDebugString KERNEL32 (a)
PeekMessageWrapW 116 PeekMessage USER32 (PeekMessage и PostMessage)
PostMessageWrapW 117 PostMessage USER32 (PeekMessage и PostMessage)
RegCreateKeyExWrapW 120 RegCreateKeyEx ADVAPI32 (a)
RegisterClassWrapW 131 RegisterClass USER32 (a), (RegisterClass)
RegOpenKeyExWrapW 125 RegOpenKeyEx ADVAPI32 (a)
RegQueryValueExWrapW 128 RegQueryValueEx ADVAPI32 (a), (g), (ValueEx), (RegQueryValueExW)
RegQueryValueWrapW 127 RegQueryValue ADVAPI32 (a), (g)
RegSetValueExWrapW 130 RegSetValueEx ADVAPI32 (a), (ValueEx)
SendMessageWrapW 136 SendMessage USER32 (SendMessage)
SetDlgItemTextWrapW 138 SetDlgItemText USER32 (a)
SetWindowLongWrapW 141 SetWindowLong USER32 (WindowLong)
SetWindowTextWrapW 143 SetWindowText USER32 (a)
ShellExecuteExWrapW 35 ShellExecuteEx SHELL32 (a), (b), (ShellExecuteEx)
ShellMessageBoxWrapW 388 ShellMessageBox SHLWAPI (a), (FormatMessage)
SHGetFileInfoWrapW 313 SHGetFileInfo SHELL32 (a), (b), (g)
SHGetPathFromIDListWrapW 334 SHGetPathFromIDList USER32 (g)
TranslateAcceleratorWrapW 146 TranslateAccelerator USER32 (i)
Отмена регистрацииClassWrapW 147 Отмена регистрацииClass USER32 (a)

 

Функции-оболочки в следующей таблице не выполняют преобразование наборов символов. Вместо этого они обеспечивают ограниченную поддержку функций операционной системы, недоступных на более ранних платформах.

Функция Порядковый номер Пересылает на DLL Комментарии
MLGetUILanguage 376 GetUserDefaultUILanguage KERNEL32 (ч)
SHCancelTimerQueueTimer 265 DeleteTimerQueueTimer KERNEL32 (ч)
SHDeleteTimerQueue 262 DeleteTimerQueue KERNEL32 (ч)
SHInterlockedCompareExchange 342 InterlockedCompareExchangePointer KERNEL32 (CompareExchange)
SHQueueUserWorkItem 260 QueueUserWorkItem KERNEL32 (QueueUserWorkItem), (h)
SHSetTimerQueueTimer 263 CreateTimerQueueTimer KERNEL32 (SetTimerQueueTimer), (h)

 

Комментарии

(a)

Если требуется преобразование строк, все строки преобразуются через кодовую страницу CP_ACP.

Эти функции используют наиболее подходящие символы и не выполняют проверку по умолчанию при преобразовании из Юникода в ANSI. Кроме того, если не удается преобразовать строку из Юникода в ANSI, функция-оболочка передает строку NULL в базовую функцию ANSI. Это может произойти, например, при нехватке памяти. Передача строки NULL может привести к сбою некоторых функций с ошибкой недопустимого параметра, но другие функции принимают строку NULL и обрабатывают ее как предполагаемый параметр. Например, если функция CreateWindowExWrapW пытается преобразовать параметр lpWindowName в ANSI, а CreateWindowEx создает окно с пустым подпись. Программа-оболочка не уведомляет вас о возникновении этих проблем.

Microsoft Layer for Unicode (MSLU) проверяет наличие ошибок во время преобразования из Юникода в ANSI и возвращает соответствующие значения ошибок. Например, функция-оболочка AppendMenu в MSLU возвращает значение 0, если элемент не был успешно добавлен.

(б)

Эти функции используют отложенную ссылку на соответствующую функцию. Это означает, что библиотека DLL, содержащая функцию в столбце "Пересылает в", не загружается Shlwapi.dll до тех пор, пока не будет вызвана функция в этой библиотеке DLL. Компоновщик Microsoft Visual C++ поддерживает эту функцию в целом с помощью параметра /DELAYLOAD.

(c)

Эта функция управляет именами файлов. Как указано в (a), функции преобразуют все строки через кодовую страницу CP_ACP. Они не проверка, настроены ли функции ввода-вывода файлов в режиме ANSI. Если функции файлового ввода-вывода находятся в режиме OEM, строки будут преобразованы в неправильный набор символов и из них. Приложение может явно задать для функций файлового ввода-вывода режим OEM, вызвав функцию SetFileApisToOEM .

**Предупреждение системы безопасности: ** Использование этих функций-оболочек для имен файлов может поставить под угрозу безопасность приложения. Так как проверка по умолчанию не выполняется и используются наиболее подходящие символы, символы имени файла можно преобразовать непредвиденным образом. Это может привести к атакам спуфингов файловой системы. Кроме того, при преобразовании из Юникода в ANSI может произойти автоматическая потеря данных.

MsLU не имеет этих ограничений.

(d)

Если для отрисовываемой строки требуется набор символов, недоступный в шрифте, выбранном в контексте устройства, эти функции-оболочки используют функцию связывания шрифтов библиотеки MLang для отрисовки каждого символа соответствующим шрифтом. В отличие от большинства других функций-оболочек, они работают в Microsoft Windows NT 4.0 в дополнение к собственным платформам ANSI.

(д)

Полные реализации этих функций в Юникоде доступны на собственных платформах ANSI. Эти функции не вызывают связанную функцию ANSI.

(f)

Если язык пользовательского интерфейса по умолчанию использует набор символов, отличный от стандартного языка пользовательского интерфейса, система пытается переписать шаблоны диалогов и элементы управления подклассами и преобразовать элементы меню в раздел "Отрисовка владельца", чтобы строки в пользовательском языке пользовательского интерфейса продолжали отображаться правильно. Единственными элементами управления, поддерживаемыми правилами перезаписи шаблонов диалогов, являются статические элементы управления, элементы управления button, listbox и combobox. Эти элементы управления подразделяются таким образом, что функция SendMessageWrapW может получить исходную строку Юникода без перевода через набор символов ANSI. В отличие от большинства других функций-оболочек, они работают на платформах Microsoft Windows NT 4.0, а также на собственных платформах ANSI. Дополнительные сведения о том, как определяются язык пользовательского интерфейса по умолчанию и язык пользовательского интерфейса по умолчанию, см. в документации по функции MLLoadLibrary .

(g)

Если требуется преобразование строк, все строки преобразуются через кодовую страницу CP_ACP.

При преобразовании из ANSI в Юникод для выходных данных, если возвращаемая строка не помещается в предоставленный буфер, функции-оболочки усечивают строку. Функции, возвращающие количество символов, скопированных в буфер, или количество символов, необходимое для предотвращения усечения, не возвращают число символов Юникода, скопированных в буфер, предоставленный или требуемый из вызывающего объекта функции-оболочки. Они возвращают количество символов ANSI, скопированных в буфер или требуемых базовой функцией ANSI. MsLU не имеет этих ограничений.

(ч)

В системах до Windows XP эти функции реализуют упрощенный пул потоков и очередь таймера. В Windows XP и более поздних версиях эти функции используют пул системных потоков и очередь системного таймера. Для функций очереди таймера параметру hQueue необходимо задать значение NULL , чтобы указать, что операция должна выполняться в очереди таймера по умолчанию.

(i)

На платформах Юникода эти функции преобразуют сообщение из Юникода в ANSI, если целевое окно — ANSI. Эти функции не выполняют перевод сообщений на собственных платформах ANSI. Поэтому при вызове приложений, вызывающих эту функцию, сообщение должно быть в формате Юникода на платформах Юникода и в формате ANSI на платформах ANSI. Например, в следующем вызове функции wParam должен быть кодовой точкой Юникода, если программа выполняется на платформе Юникода, и символом ANSI, если программа выполняется на платформе ANSI.

CallWindowProcWrapW(prevWndProc, hwnd, WM_CHAR, wParam, lParam);

MSLU отслеживает набор символов процедуры окна назначения и при необходимости преобразует сообщение.

(j)

На платформах ANSI эти функции возвращают длину базовой строки ANSI, а не длину переведенной строки Юникода. MsLU не имеет этих ограничений.

(CompareExchange)

Синтаксис SHInterlockedCompareExchange несколько отличается от синтаксиса InterlockedCompareExchangePointer, но работает одинаково.

void* SHInterlockedCompareExchange(void **ppDest, void *pExch, void *pComp);

(CompareString)

Помните, что на собственных платформах ANSI обе строки преобразуются в ANSI и сравниваются как строки ANSI. Если строки Юникода содержат символы, которые не могут быть представлены в ANSI, результаты могут быть непредвиденными. Например, если кодовая страница ANSI по умолчанию не поддерживает символы CJK, строки L"\x66F0" и L"\x6708" будут сравниваться как равные на собственных платформах ANSI, так как они сопоставляются со строкой ANSI "?".

(DateTime)

В Shlwapi.dll версии 5.0, поставляемой с Windows 2000, кодовая страница идентификатора языкового стандарта, передаваемого в качестве первого параметра GetDateFormatWrapWrapW и GetTimeFormatWrapW, должна соответствовать текущей кодовой странице ANSI. В противном случае возвращаемая строка может быть преобразована неправильно. Это ограничение не применяется к Shlwapi.dll версии 5.5 или более поздней. Это означает, что на системы Windows XP и более поздних версий это ограничение не распространяется. MsLU не имеет этого ограничения.

(DialogBoxParam)

Параметр lpTemplateName для функции DialogBoxParamWrapW не может быть строкой. Это должен быть порядковый номер, созданный макросом MAKEINTRESOURCE . Диалоговая процедура, заданная параметром lpDialogFunc , получает сообщения ANSI на собственных платформах ANSI и сообщения Юникода на собственных платформах Юникода. Процедура диалога должна быть подготовлена для обработки обоих случаев. MsLU не имеет этих ограничений.

(ExtTextOut)

Собственные платформы ANSI реализуют функцию ExtTextOutW , а также собственные платформы Юникода. Цель ExtTextOutWrapW — выполнить связывание шрифтов, как описано в отдельном примечаниях.

(DragQueryFile)

Функция DragQueryFileWrapW не позволяет запрашивать длину файла в дескрипторе перетаскивания, передавая значение NULL в качестве параметра lpszFile . MsLU не имеет этих ограничений.

(FormatMessage)

На собственных платформах ANSI форматы в строке не преобразуются из Юникода в ANSI. Например, в следующем примере кода возникает ошибка.

WCHAR szBuffer[MAX_PATH];
DWORD_PTR Arguments[2] = { L"String1", L"String2" };

FormatMessageWrapW(FORMAT_MESSAGE_FROM_STRING, 
               L"%1!s! %2", 
               0, 0, 
               szBuffer, 
               MAX_PATH, 
               (va_list*)Arguments);

В этом примере кода используется формат "!s!". На собственных платформах ANSI эта строка передается в версию ANSI функции FormatMessage . Следовательно, вместо строки Юникода ожидается строка ANSI. Аналогичным образом формат "%2" подразумевает строковый аргумент. При передаче в функцию ANSI FormatMessage он интерпретируется как строка ANSI, а не строка Юникода. Правильная строка формата L"%1!ws! %2!ws!". При этом строки правильно печатаются на платформах ANSI и Юникода.

Функция не поддерживает строку специального формата "%0".

MsLU не имеет этих ограничений.

(GetClassInfo)

На собственных платформах ANSI члены lpszMenuName и lpszClassName структуры WNDCLASS не переводятся в Юникод и всегда имеют значение NULL. Кроме того, процедура окна, возвращаемая в элементе lpfnWndProc структуры WNDCLASS , не преобразуется в Юникод и ссылается на процедуру окна ANSI. MsLU не имеет этих ограничений.

В Shlwapi.dll версии 5.0, поставляемой с Windows 2000, строки пунктов меню, содержащие символы табуляции (\t), могут отображаться неправильно. Это ограничение не применяется к Shlwapi.dll версии 5.5 или более поздней. Это означает, что на системы Windows XP и более поздних версий это ограничение не распространяется. MsLU не имеет этого ограничения.

Эта функция поддерживает только версию MENUITEMINFOW microsoft Windows NT 4.0. В этой структуре отсутствует элемент hbmpItem . Кроме того, функция не поддерживает флаг MIIM_BITMAP. MsLU не имеет этих ограничений.

(OpenFileName)

Член cbSize структуры OPENFILENAMEW должен иметь значение sizeof(OPENFILENAME_NT4W).

Член lpstrCustomFilter структуры OPENFILENAMEW должен иметь значение NULL.

Значения элементов nMaxFile и nMaxFileTitle структуры OPENFILENAMEW не должны превышать MAX_PATH.

Если член lpfnHook структуры OPENFILENAMEW не имеет значения NULL, он должен ссылаться на процедуру перехватчика ANSI на собственных платформах ANSI и процедуру перехватчика Юникода на собственных платформах Юникода.

MsLU не имеет этих ограничений.

(PeekMessage и PostMessage)

На собственных платформах ANSI преобразование переданного или извлеченного сообщения не выполняется. Передаваемое или полученное сообщение — это ANSI на собственных платформах ANSI и Юникод на собственных платформах Юникода. Вызывающее приложение должно быть готово к обработке обоих случаев. Например, если полученное сообщение WM_CHAR, то wParam — это код символов ANSI на собственных платформах ANSI, но кодовая точка Юникода на собственных платформах Юникода. MsLU не имеет этих ограничений.

(QueueUserWorkItem)

Функция SHQueueUserWorkItem немного отличается от соответствующей функции QueueUserWorkItem . Синтаксис для SHQueueUserWorkItem показан здесь.

BOOL SHQueueUserWorkItem(LPTHREAD_START_ROUTINE pfnCallback,
                     LPVOID pContext,
                     LONG lPriority,
                     DWORD_PTR dwTag,
                     DWORD_PTR * pdwId,
                     LPCSTR pszModule,
                     DWORD dwFlags);

Параметры должны быть заданы следующим образом:

  • Параметры pfnCallback и pContext имеют те же значения, что и параметры Function и Context , соответственно, объекта QueueUserWorkItem.

  • Параметр dwTag не используется и должен иметь значение 0.

  • Параметр pdwld не используется и должен иметь значение NULL.

  • Параметр pszModule указывает на необязательную строку ANSI со значением NULL, которая указывает имя библиотеки, которая должна быть загружена до начала работы рабочего элемента и выгружена после завершения рабочего элемента. Этот параметр может принимать значение NULL.

  • Параметр dwFlags поддерживает только подмножество значений, поддерживаемых QueueUserWorkItem. Распознаются следующие флаги.

    Имя Значение Значение
    TPS_EXECUTEIO 0x00000001 То же, что и WT_EXECUTEINIOTHREAD.
    TPS_LONGEXECTIME 0x00000008 То же, что и WT_EXECUTELONGFUNCTION.

     

    Примечание

    Флаг TPS_LONGEXECTIME имеет не то же числовое значение, что и флаг WT_EXECUTELONGFUNCTION. При использовании SHQueueUserWorkItem параметр dwFlags должен представлять собой сочетание значений TPS_*, а не WT_*.

     

SHQueueUserWorkItem возвращает ненулевое значение, если рабочий элемент был успешно поставлен в очередь, и 0 в противном случае. Если функция завершается сбоем, можно использовать GetLastError для получения дополнительных сведений.

(RegisterClass)

На собственных платформах ANSI преобразование элемента lpfnWndProc структуры WNDCLASSW не выполняется. Окно будет получать сообщения о окне ANSI на собственных платформах ANSI и сообщения окон Юникода на собственных платформах Юникода. Процедура окна должна быть подготовлена для обработки обоих случаев. MsLU не имеет этих ограничений.

(RegQueryValueExW)

RegQueryValueExWrapW также вызывается под именем RegQueryValueExW. Как и в случае с любой неименованной функцией, экспортируемой строго по порядковому номеру, можно выбрать имя, по которому функция известна в коде.

(SendMessage)

На собственных платформах Юникода функция SendMessageWrapW перенаправляла функцию SendMessageW . На собственных платформах ANSI SendMessageWrapW обеспечивает ограниченную поддержку перевода сообщений Юникода в ANSI. Список поддерживаемых сообщений приведен в следующей таблице. Функция не будет переводить другие сообщения.

MsLU не имеет этих ограничений.

Сообщение Описание
CB_ADDSTRING (b) (f) (c)
CB_FINDSTRING (b) (f) (c)
CB_FINDSTRINGEXACT (a) (f) (c)
CB_GETLBTEXT (b) (f) (c) (o) Буфер, передаваемый в параметре lParam , должен содержать не менее 256 символов.
CB_GETLBTEXTLEN (a)
CB_INSERTSTRING (b) (f) (c)
CB_SELECTSTRING (b) (f) (c)
EM_CHARFROMPOS
EM_GETLINE (e) Возвращаемое значение — это количество скопированных символов ANSI.
EM_GETSEL
EM_REPLACESEL (b) (f)
EM_SETPASSWORDCHAR (a)
EM_SETSEL
EM_SETWORDBREAKPROC Это сообщение не оказывает никакого влияния. Процедура разбиения по словам не задана.
LB_ADDSTRING (b) (f) (d)
LB_FINDSTRING (b) (f) (d)
LB_FINDSTRINGEXACT (b) (f) (lbs)
LB_GETTEXT (b) (f) (lbs) (o) Буфер, передаваемый в параметре lParam , должен содержать не менее 256 символов.
LB_GETTEXTLEN (a)
LB_INSERTSTRING (b) (f) (d)
LB_SELECTSTRING (b) (f) (d)
WM_GETTEXT (b) (f)
WM_GETTEXTLENGTH (a)
WM_SETTEXT (b) (f)
WM_SETTINGCHANGE (a) Сообщение отправляется с временем ожидания в три секунды.

 

  • (a) Измеряемая или извлекаемая строка ANSI должна соответствовать следующему условию: длина соответствующей версии строки в Юникоде не может превышать длину версии ANSI строки. Если это условие не выполняется, возвращаемая длина будет короткой. Если памяти недостаточно для определения длины строки Юникода, функция возвращает ноль, а не LB_ERR или CB_ERR, как можно было бы ожидать.

  • (б) Если требуется преобразование строк, все строки преобразуются через кодовую страницу CP_ACP.

    Эта функция использует наиболее подходящие символы и не выполняет проверку по умолчанию при преобразовании из Юникода в ANSI. Кроме того, если не удается преобразовать строку из Юникода в ANSI, функция передает строку NULL в базовую функцию ANSI. Это может произойти, например, при нехватке памяти. Передача строки null может привести к сбою некоторых функций с ошибкой недопустимого параметра, но другие функции принимают строку NULL и обрабатывают ее как предполагаемый параметр. Например, если при попытке оболочки WM_SETTEXT преобразовать заголовок окна в ANSI возникает ошибка, в окне будет пустое подпись. Функция не уведомляет вас о возникновении этих проблем. MsLU не имеет этих ограничений.

  • (c) Указанный дескриптор окна должен быть дескриптором для элемента управления ComboBox или ComboBoxEx . Если дескриптор принадлежит к элементу управления со списком, который рисуется владельцем и не был создан со стилем Стили списка , перевод этого сообщения завершится ошибкой и даже может завершиться сбоем.

  • (d) Указанный дескриптор окна должен быть дескриптором для элемента управления listbox. Если поле listbox отрисовывается владельцем и не было создано в стиле стиле "Стили полей со списком ", перевод этого сообщения завершится ошибкой и даже может завершиться сбоем.

  • (e) Если требуется преобразование строк, все строки преобразуются через кодовую страницу CP_ACP.

    При преобразовании из ANSI в Юникод для выходных данных функции-оболочки усечивают возвращаемую строку, если она не помещается в предоставленный буфер. Возвращаемое значение для функций, возвращающих количество символов, скопированных в буфер, или число символов, необходимое для предотвращения усечения, относится к количеству символов ANSI, скопированных в буфер или требуемых базовой функцией ANSI, а не к числу символов Юникода, скопированных в буфер, предоставленный или требуемый из вызывающего приложения, вызвавающего функцию-оболочку. MsLU не имеет этого ограничения. Дополнительные сведения см. в статье Microsoft Layer for Юникод в системах Windows 95/98/Me.

(SetTimerQueueTimer)

Функция SHSetTimerQueueTimer немного отличается от соответствующей функции CreateTimerQueueTimer . Ее синтаксис выглядит следующим образом:

HANDLE SHSetTimerQueueTimer(HANDLE hQueue,
                        WAITORTIMERCALLBACK pfnCallback,
                        LPVOID pContext,
                        DWORD dwDueTime,
                        DWORD dwPeriod,
                        LPCSTR lpszLibrary,
                        DWORD dwFlags);

Параметры должны быть заданы следующим образом:

  • Параметру hQueue необходимо задать значение NULL, указывая очередь таймера по умолчанию.

  • Параметры pfnCallback, pContext, dwDueTime и dwPeriod имеют те же значения, что и параметры Callback, Parameter, DueTime и Period соответственно createTimerQueueTimer.

  • Параметр lpszLibrary не используется и должен иметь значение NULL.

  • Параметр Flags поддерживает только подмножество значений, поддерживаемых CreateTimerQueueTimer.

    Имя Значение Значение
    TPS_EXECUTEIO 0x00000001 То же, что и WT_EXECUTEINIOTHREAD
    TPS_LONGEXECTIME 0x00000008 То же, что и WT_EXECUTELONGFUNCTION

     

    Примечание

    Флаг TPS_LONGEXECTIME имеет не то же числовое значение, что и флаг WT_EXECUTELONGFUNCTION. При использовании SHSetTimerQueueTimer параметр dwFlags должен представлять собой сочетание значений TPS_*, а не WT_*.

     

SHSetTimerQueueTimer возвращает дескриптор созданного таймера при успешном выполнении и значение NULL в противном случае.

(ShellExecuteEx)

Член lpFile структуры SHELLEXECUTEINFO , передаваемый в единственном параметре этой функции, не может превышать INTERNET_MAX_URL_LENGTH символов. Если флаг SEE_MASK_CLASSNAME опущен, член lpClass должен быть инициализирован в значение NULL.

(ValueEx)

Поддерживаются только следующие типы данных реестра: REG_SZ, REG_EXPAND_SZ, REG_BINARY и REG_DWORD. В отличие от этих функций-оболочек, MSLU также поддерживает REG_MULTI_EXPAND_SZ.

(WindowLong)

На собственных платформах ANSI функция не выполняет никакого преобразования для оконных long. Например, при передаче GWLP_WNDPROC функция возвращает процедуру окна ANSI, а не thunk. MsLU не имеет этих ограничений.