Export (0) Print
Expand All
Expand Minimize

SHLWAPI Wrapper Functions

[These functions are available through Windows XP Service Pack 2 (SP2) and Windows Server 2003. They might be altered or unavailable in subsequent versions of Windows.]

The tables in this document list wrapper functions from Shlwapi.dll that provide limited Unicode functionality to Windows 95, Windows 98, and Windows Millennium Edition (Windows Me).

Windows 95, Windows 98, and Windows Millennium Edition (Windows Me) are referred to here as "native ANSI platforms". On native ANSI platforms, these wrapper functions convert the Unicode input string parameters to ANSI and call ANSI versions of functions in the Forwards To column. For example, AppendMenuWrapW calls AppendMenuA, which is the ANSI version of AppendMenu. The other functions follow the same pattern. Any strings returned by the ANSI function are converted to Unicode and returned to the calling application. Aside from the exceptions noted in the Remarks column, the wrapper function has the same syntax and provides the same functionality as the function in the Forwards To column. You should refer to that reference page for detailed usage information.

Security Warning:  Multiple Unicode strings can convert to the same ANSI string. Unexpected collisions after conversion could result in unexpected behavior. For example, if CreateEventWrapW is used to create two differently-named events whose names match after conversion from Unicode to ANSI, the second call will return a handle to the same event as the first call, even though the original Unicode strings were different.

Microsoft Windows NT, Windows 2000, Windows XP, Windows Server 2003, and later operating systems are referred to here as "native Unicode platforms". For the most part, on native Unicode platforms, these wrapper functions simply forward input string parameters to the Unicode version of the function in the Forwards To column. For example, AppendMenuWrapW forwards to AppendMenuW, which is the Unicode version of AppendMenu. The other functions follow the same pattern. Any strings that are returned by the Unicode function are returned to the calling application. Aside from the exceptions noted in the Remarks column, the wrapper function has the same syntax and provides the same functionality as the function in the Forwards To column. You should refer to that reference page for detailed usage information.

Security Warning:  The security issues noted for the functions in the Forwards To column also apply to the corresponding wrapper functions. For details, see the reference documentation for the function in the Forwards To column.

The wrapper functions in this table are all contained in Shlwapi.dll. To call them, you must use the ordinal listed in the table.

Note  These wrapper functions are available on Windows XP but do not provide any wrapper functionality in Windows XP Service Pack 2 (SP2) and later. They also do not provide wrapper functionality in Windows Server 2003. You should use the functions listed in the Forwards To column instead.

FunctionOrdinalForwards ToDLLRemarks
AppendMenuWrapW36 AppendMenu USER32(a), (f), (Menu)
CallWindowProcWrapW37 CallWindowProc USER32(i)
CharLowerWrapW38 CharLower KERNEL32(e)
CharUpperBufWrapW44 CharUpperBuff KERNEL32(e)
CharUpperWrapW43 CharUpper KERNEL32(e)
CompareStringWrapW45 CompareString KERNEL32(CompareString)
CopyFileWrapW112 CopyFile KERNEL32(a), (c)
CreateEventWrapW51 CreateEvent KERNEL32(a)
CreateFileWrapW 52 CreateFile KERNEL32(a), (c)
CreateWindowExWrapW55 CreateWindowEx USER32(a)
DefWindowProcWrapW56 DefWindowProc USER32(i)
DeleteFileWrapW57 DeleteFile KERNEL32(a), (c)
DialogBoxParamWrapW 59 DialogBoxParam USER32(f), (i), (DialogBoxParam)
DispatchMessageWrapW60 DispatchMessage USER32(i)
DragQueryFileWrapW318 DragQueryFile SHELL32(b), (c), (g), (DragQueryFile)
DrawTextExWrapW301 DrawTextEx USER32(a), (d)
DrawTextWrapW61 DrawText USER32(a)
ExtTextOutWrapW299 ExtTextOut GDI32(d), (f), (ExtTextOut)
FormatMessageWrapW 68 FormatMessage KERNEL32(a), (g), (FormatMessage)
GetClassInfoWrapW 69 GetClassInfo USER32(GetClassInfo)
GetDateFormatWrapW311 GetDateFormat KERNEL32(a), (g), (DateTime)
GetDlgItemTextWrapW74 GetDlgItemText USER32(g)
GetFileAttributesWrapW75 GetFileAttributes KERNEL32(a), (c)
GetLocaleInfoWrapW77 GetLocaleInfo KERNEL32(g)
GetMenuItemInfoWrapW302 GetMenuItemInfo USER32(f), (g), (MenuItemInfo)
GetModuleFileNameWrapW80 GetModuleFileName KERNEL32(c), (g)
GetModuleHandleWrapW83 GetModuleHandle KERNEL32(c), (g)
GetObjectWrapW84 GetObject GDI32(g)
GetOpenFileNameWrapW403 GetOpenFileName COMDLG32(a), (b), (g), (OpenFileName)
GetSaveFileNameWrapW389 GetSaveFileName COMDLG32(a), (b), (g), (OpenFileName)
GetSystemDirectoryWrapW81 GetSystemDirectory KERNEL32(c), (g)
GetTimeFormatWrapW310 GetTimeFormat KERNEL32(a), (g), (DateTime)
GetWindowLongWrapW94 GetWindowLong USER32(WindowLong)
GetWindowsDirectoryWrapW97 GetWindowsDirectory KERNEL32(c), (g)
GetWindowTextLengthWrapW96 GetWindowTextLength USER32(j)
GetWindowTextWrapW95 GetWindowText USER32(f), (g)
InsertMenuItemWrapW98 InsertMenuItem USER32(a), (f), (Menu), (MenuItemInfo)
IsCharAlphaWrapW25 IsCharAlpha USER32(e)
IsCharAlphaNumericWrapW28 IsCharAlphaNumeric KERNEL32(e)
IsCharUpperWrapW26 IsCharUpper USER32(e)
LoadLibraryWrapW105 LoadLibrary KERNEL32(a), (c)
LoadStringWrapW107 LoadString KERNEL32(e)
MessageBoxWrapW340 MessageBox USER32(a)
MoveFileWrapW113 MoveFile KERNEL32(a), (c)
OutputDebugStringWrapW 115 OutputDebugString KERNEL32(a)
PeekMessageWrapW116 PeekMessage USER32(PeekMessage and PostMessage)
PostMessageWrapW117 PostMessage USER32(PeekMessage and PostMessage)
RegCreateKeyExWrapW120 RegCreateKeyEx ADVAPI32(a)
RegisterClassWrapW131 RegisterClass USER32(a), (RegisterClass)
RegOpenKeyExWrapW125 RegOpenKeyEx ADVAPI32(a)
RegQueryValueExWrapW128 RegQueryValueEx ADVAPI32(a), (g), (ValueEx), (RegQueryValueExW)
RegQueryValueWrapW127 RegQueryValue ADVAPI32(a), (g)
RegSetValueExWrapW130 RegSetValueEx ADVAPI32(a), (ValueEx)
SendMessageWrapW136 SendMessage USER32(SendMessage)
SetDlgItemTextWrapW138 SetDlgItemText USER32(a)
SetWindowLongWrapW141 SetWindowLong USER32(WindowLong)
SetWindowTextWrapW143 SetWindowText USER32(a)
ShellExecuteExWrapW35 ShellExecuteEx SHELL32(a), (b), (ShellExecuteEx)
ShellMessageBoxWrapW388 ShellMessageBox SHLWAPI(a), (FormatMessage)
SHGetFileInfoWrapW313 SHGetFileInfo SHELL32(a), (b), (g)
SHGetPathFromIDListWrapW334 SHGetPathFromIDList USER32(g)
TranslateAcceleratorWrapW146 TranslateAccelerator USER32(i)
UnregisterClassWrapW147 UnregisterClass USER32(a)

 

The wrapper functions in the following table do not perform any character set conversion. Instead, they provide limited support for operating system features not available on earlier platforms.

FunctionOrdinalForwards ToDLLRemarks
MLGetUILanguage376 GetUserDefaultUILanguage KERNEL32(h)
SHCancelTimerQueueTimer265 DeleteTimerQueueTimer KERNEL32(h)
SHDeleteTimerQueue262 DeleteTimerQueue KERNEL32(h)
SHInterlockedCompareExchange342 InterlockedCompareExchangePointer KERNEL32(CompareExchange)
SHQueueUserWorkItem260 QueueUserWorkItem KERNEL32(QueueUserWorkItem), (h)
SHSetTimerQueueTimer263 CreateTimerQueueTimer KERNEL32(SetTimerQueueTimer), (h)

 

Remarks

(a)

If string conversion is necessary, all strings are converted through the CP_ACP code page.

These functions employ best-fit characters and do not perform default checking when converting from Unicode to ANSI. Furthermore, if the string cannot be converted from Unicode to ANSI, the wrapper function passes a NULL string to the underlying ANSI function. This can occur, for example, when there is insufficient memory. Passing a NULL string may cause some functions to fail with an invalid parameter error, but other functions accept the NULL string and treat it as the intended parameter. For example, an error occurs when the CreateWindowExWrapW function attempts to convert the lpWindowName parameter to ANSI, and CreateWindowEx creates a window with an empty caption. The wrapper does not notify you when these problems have occurred.

The Microsoft Layer for Unicode (MSLU) checks for errors during conversion from Unicode to ANSI and returns appropriate error values. For example, the AppendMenu wrapper function in the MSLU returns 0 if the item was not successfully appended.

(b)

These functions use a delay-loaded link to the appropriate function. This means that the DLL that contains the function in the "Forwards To" column is not loaded by the Shlwapi.dll until a function in that DLL is called. The Microsoft Visual C++ linker supports this functionality more generally via the /DELAYLOAD option.

(c)

This function manipulates filenames. As noted in (a), the functions convert all strings through the CP_ACP code page. They do not check whether the file I/O functions have been set to ANSI mode. If the file I/O functions are in OEM mode, the strings will be converted to and from the wrong character set. An application can set the file I/O functions to OEM mode explicitly by calling the SetFileApisToOEM function.

Security Warning:   Using these wrapper functions for file names can compromise the security of your application. Since no default checking is performed and best-fit characters are employed, filename characters can be converted in unexpected ways. This could result in file system spoofing attacks. Also, silent data loss can occur during the conversion from Unicode to ANSI.

The MSLU does not have these limitations.

(d)

If the string being drawn requires a character set that is not available in the font that is selected into the device context, these wrapper functions use the Font Linking feature of the MLang library to render each character in an appropriate font. Unlike most other wrapper functions, these are functional on Microsoft Windows NT 4.0 in addition to native ANSI platforms.

(e)

Full Unicode implementations of these functions are available on native ANSI platforms. These functions do not call the related ANSI function.

(f)

If the user-default UI language uses a different character set than the system-default UI language, the system attempts to rewrite dialog templates and subclass controls and convert menu items to owner-draw, so that strings in the user-default UI language continue to display correctly. The only controls supported by the dialog template rewrite rules are static, button, listbox, and combobox controls. These controls are subclassed such that the SendMessageWrapW function can obtain the original Unicode string without being translated through the ANSI character set. Unlike most of the other wrapper functions, these are functional on Microsoft Windows NT 4.0 as well as native ANSI platforms. See the remarks in the documentation of the MLLoadLibrary function for further discussion of how the user-default UI language and system-default UI language are determined.

(g)

If string conversion is necessary, all strings are converted through the CP_ACP code page.

When converting from ANSI to Unicode for output, if the returned string does not fit in the buffer that was provided, the wrapper functions truncate the string. Those functions that return the number of characters copied to the buffer or the number of characters necessary to avoid truncation do not return the number of Unicode characters copied to the buffer provided by or required from the caller of the wrapper function. They return the number of ANSI characters copied to the buffer or required by the underlying ANSI function. The MSLU does not have these limitations.

(h)

On systems prior to Windows XP, these functions implement a simplified thread pool and timer queue. On Windows XP and later, these functions use the system thread pool and system timer queue. For the timer queue functions, the hQueue parameter must be set to NULL to indicate that the operation is to be performed on the default timer queue.

(i)

On Unicode platforms, these functions translate the message from Unicode to ANSI if the destination window is ANSI. These functions do not perform message translation on native ANSI platforms. Therefore, calling applications calling this function must ensure that the message is in Unicode format on Unicode platforms and in ANSI format on ANSI platforms. For instance, in the following function call, the wParam must be a Unicode code point if the program is running on a Unicode platform and must be an ANSI character if the program is running on an ANSI platform.

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

The MSLU tracks the character set of the destination window procedure and converts the message as necessary.

(j)

On ANSI platforms, these functions return the length of the underlying ANSI string, not the length of the translated Unicode string. The MSLU does not have these limitations.

(CompareExchange)

The syntax for SHInterlockedCompareExchange is somewhat different from that of InterlockedCompareExchangePointer, but it functions identically.

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

(CompareString)

Remember that on native ANSI platforms, both strings are converted to ANSI and compared as ANSI strings. If the Unicode strings contain characters that cannot be represented in ANSI, the results may be unexpected. For example, if the default ANSI code page does not support CJK characters, then the strings L"\x66F0" and L"\x6708" would compare as equal on native ANSI platforms because they both map to the ANSI string "?".

(DateTime)

On Shlwapi.dll version 5.0, which shipped with Windows 2000, the code page of the locale identifier that you pass as the first parameter of GetDateFormatWrapW and GetTimeFormatWrapW must match the current ANSI codepage. Otherwise, the returned string may be converted incorrectly. This limitation does not apply to Shlwapi.dll versions 5.5 or higher. This means that Windows XP and later systems are not subject to this limitation. The MSLU does not have this limitation.

(DialogBoxParam)

The lpTemplateName parameter for the DialogBoxParamWrapW function cannot be a string. It must be an ordinal created by the MAKEINTRESOURCE macro. The dialog procedure specified by the lpDialogFunc parameter receives ANSI messages on native ANSI platforms and Unicode messages on native Unicode platforms. The dialog procedure must be prepared to handle both cases. The MSLU does not have these limitations.

(ExtTextOut)

Native ANSI platforms implement the ExtTextOutW function as well as native Unicode platforms. The purpose of ExtTextOutWrapW is to perform font linking, as described in a separate remark.

(DragQueryFile)

The DragQueryFileWrapW function does not allow you to query for the length of a file in the drop handle by passing NULL as the lpszFile parameter. The MSLU does not have these limitations.

(FormatMessage)

On native ANSI platforms, the formats in the string are not converted from Unicode to ANSI. For example, the following code example is in error.



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);

This code example uses the "!s!" format. On native ANSI platforms, this string is passed to the ANSI version of the FormatMessage function. Consequently, an ANSI string is expected instead of a Unicode string. Similarly, the "%2" format implies a string argument. When it is passed to the ANSI FormatMessage function, it is interpreted as an ANSI string rather than a Unicode string. The correct format string is L"%1!ws! %2!ws!". This prints strings correctly on both ANSI and Unicode platforms.

The function does not support the "%0" special format string.

The MSLU does not have these limitations.

(GetClassInfo)

On native ANSI platforms, the lpszMenuName and lpszClassName members of the WNDCLASS structure are not translated to Unicode and are always set to NULL. Furthermore, the window procedure returned in the lpfnWndProc member of the WNDCLASS structure is not translated to Unicode, and refers to an ANSI window procedure. The MSLU does not have these limitations.

(Menu)

On Shlwapi.dll version 5.0, which shipped with Windows 2000, menu item strings that contain tab characters (\t) may not display correctly. This limitation does not apply to Shlwapi.dll versions 5.5 or higher. This means that Windows XP and later systems are not subject to this limitation. The MSLU does not have this limitation.

(MenuItemInfo)

This function only supports the Microsoft Windows NT 4.0 version of the MENUITEMINFOW structure. This structure lacks an hbmpItem member. In addition, the function does not support the MIIM_BITMAP flag. The MSLU does not have these limitations.

(OpenFileName)

The cbSize member of the OPENFILENAMEW structure must be set to sizeof(OPENFILENAME_NT4W).

The lpstrCustomFilter member of the OPENFILENAMEW structure must be set to NULL.

The values of the nMaxFile and nMaxFileTitle members of the OPENFILENAMEW structure must not exceed MAX_PATH.

If the lpfnHook member of the OPENFILENAMEW structure is not NULL, it must refer to an ANSI hook procedure on native ANSI platforms and a Unicode hook procedure on native Unicode platforms.

The MSLU does not have these limitations.

(PeekMessage and PostMessage)

On native ANSI platforms, no translation is performed on the transmitted or retrieved message. The transmitted/retrieved message is ANSI on native ANSI platforms and Unicode on native Unicode platforms. The calling application must be prepared to handle both cases. For example, if the retrieved message is WM_CHAR, then the wParam is an ANSI character code on native ANSI platforms but it is a Unicode code point on native Unicode platforms. The MSLU does not have these limitations.

(QueueUserWorkItem)

The SHQueueUserWorkItem function is slightly different from the corresponding QueueUserWorkItem function. The syntax for SHQueueUserWorkItem is shown here.

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

The parameters should be set as follows:

  • The pfnCallback and pContext parameters have the same meanings as the Function and Context parameters, respectively, of QueueUserWorkItem.
  • The dwTag parameter is unused and must be set to 0.
  • The pdwld parameter is unused and must be set to NULL.
  • The pszModule parameter points to an optional null-terminated ANSI string that specifies the name of a library to be loaded before the work item begins and unloaded after the work item completes. This parameter can be NULL.
  • The dwFlags parameter supports only a subset of the values supported by QueueUserWorkItem. The following flags are recognized.

    NameValueMeaning
    TPS_EXECUTEIO0x00000001Same as WT_EXECUTEINIOTHREAD.
    TPS_LONGEXECTIME0x00000008Same as WT_EXECUTELONGFUNCTION.

     

    Note  The TPS_LONGEXECTIME flag does not have the same numerical value as the WT_EXECUTELONGFUNCTION flag. When using SHQueueUserWorkItem, the dwFlags parameter must be a combination of TPS_* values, not WT_* values.

SHQueueUserWorkItem returns a nonzero value if the work item was successfully queued and 0 otherwise. If the function fails, you can use GetLastError to obtain additional information.

(RegisterClass)

On native ANSI platforms, no translation is performed on the lpfnWndProc member of the WNDCLASSW structure. The window will receive ANSI window messages on native ANSI platforms and Unicode window messages on native Unicode platforms. The window procedure must be prepared to handle both cases. The MSLU does not have these limitations.

(RegQueryValueExW)

RegQueryValueExWrapW has also been called under the name RegQueryValueExW. As with any unnamed function exported strictly by ordinal, you can choose the name that the function is known by in your code.

(SendMessage)

On native Unicode platforms, the SendMessageWrapW function forwards to the SendMessageW function. On native ANSI platforms, SendMessageWrapW provides limited support for translating Unicode messages to ANSI. The list of supported messages is given in the following table. The function will not translate any other messages.

The MSLU does not have these limitations.

CB_ADDSTRING(b) (f) (c)
CB_FINDSTRING(b) (f) (c)
CB_FINDSTRINGEXACT(a) (f) (c)
CB_GETLBTEXT(b) (f) (c) (o) The buffer passed in the lParam parameter must have room for at least 256 characters.
CB_GETLBTEXTLEN(a)
CB_INSERTSTRING(b) (f) (c)
CB_SELECTSTRING(b) (f) (c)
EM_CHARFROMPOS
EM_GETLINE(e) The return value is the number of ANSI characters copied.
EM_GETSEL
EM_REPLACESEL(b) (f)
EM_SETPASSWORDCHAR(a)
EM_SETSEL
EM_SETWORDBREAKPROCThis message has no effect. The word break procedure is not set.
LB_ADDSTRING(b) (f) (d)
LB_FINDSTRING(b) (f) (d)
LB_FINDSTRINGEXACT(b) (f) (lbs)
LB_GETTEXT(b) (f) (lbs) (o) The buffer passed in the lParam parameter must have room for at least 256 characters.
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) The message is sent with a timeout of three seconds.

 

  • (a) The ANSI string being measured or retrieved must satisfy the following condition: the length of the corresponding Unicode version of the string cannot exceed the length of the ANSI version of the string. If this condition is not met, the returned length will be short. If there is insufficient memory to determine the length of the Unicode string, the function returns zero, not LB_ERR or CB_ERR as might be expected.
  • (b) If string conversion is necessary, all strings are converted through the CP_ACP code page.

    This function employs best-fit characters and does not perform default checking when converting from Unicode to ANSI. Furthermore, if the string cannot be converted from Unicode to ANSI, the function passes a null string to the underlying ANSI function. This can occur, for example, when there is insufficient memory. Passing a null string may cause some functions to fail with an invalid parameter error, but other functions accept the null string and treat it as the intended parameter. For example, if an error occurs when the WM_SETTEXT wrapper attempts to convert the window title to ANSI, the window will have an empty caption. The function does not notify you when these problems occur. The MSLU does not have these limitations.

  • (c) The specified window handle must be the handle to a ComboBox or ComboBoxEx control. If the handle is to a combobox control that is owner-draw and was not created with the List Box Styles style, then the translation of this message will fail and may even crash.
  • (d) The specified window handle must be the handle to a listbox control. If the listbox is owner-draw and was not created with the List Box Styles style, then the translation of this message will fail and may even crash.
  • (e) If string conversion is necessary, all strings are converted through the CP_ACP code page.

    When converting from ANSI to Unicode for output, the wrapper functions truncate the returned string if it does not fit in the provided buffer. The return value for functions that return the number of characters copied to the buffer or the number of characters necessary to avoid truncation refers to the number of ANSI characters copied to the buffer or required by the underlying ANSI function, not the number of Unicode characters copied to the buffer provided by or required from the calling application that called the wrapper function. The MSLU does not have this limitation. For further details, see Microsoft Layer for Unicode on Windows 95/98/Me Systems.

(SetTimerQueueTimer)

The SHSetTimerQueueTimer function is slightly different from the corresponding CreateTimerQueueTimer function. Its syntax is as follows:


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

The parameters should be set as follows:

  • The hQueue parameter must be set to NULL, specifying the default timer queue.
  • The pfnCallback, pContext, dwDueTime, and dwPeriod parameters have the same meanings as the Callback, Parameter, DueTime, and Period parameters, respectively, of CreateTimerQueueTimer.
  • The lpszLibrary parameter is unused and must be set to NULL.
  • The Flags parameter supports only a subset of the values supported by CreateTimerQueueTimer.

    NameValueMeaning
    TPS_EXECUTEIO0x00000001Same as WT_EXECUTEINIOTHREAD
    TPS_LONGEXECTIME0x00000008Same as WT_EXECUTELONGFUNCTION

     

    Note  The TPS_LONGEXECTIME flag does not have the same numerical value as the WT_EXECUTELONGFUNCTION flag. When using SHSetTimerQueueTimer, the dwFlags parameter must be a combination of TPS_* values, not WT_* values.

SHSetTimerQueueTimer returns the handle of the created timer on success and NULL otherwise.

(ShellExecuteEx)

The lpFile member of the SHELLEXECUTEINFO structure passed in this function's only parameter may not exceed INTERNET_MAX_URL_LENGTH characters. If the SEE_MASK_CLASSNAME flag is omitted, the lpClass member must be initialized to NULL.

(ValueEx)

Only the following registry data types are supported: REG_SZ, REG_EXPAND_SZ, REG_BINARY, and REG_DWORD. Unlike these wrapper functions, the MSLU also supports REG_MULTI_EXPAND_SZ.

(WindowLong)

On native ANSI platforms, the function performs no translation on any of the window longs. For example, if you pass GWLP_WNDPROC, the function returns the ANSI window procedure, not a thunk. The MSLU does not have these limitations.

 

 

Community Additions

ADD
Show:
© 2014 Microsoft