📄 ordinal.c
字号:
* Get Explorers "AcceptLanguage" setting.
*
* PARAMS
* langbuf [O] Destination for language string
* buflen [I] Length of langbuf
* [0] Success: used length of langbuf
*
* RETURNS
* Success: S_OK. langbuf is set to the language string found.
* Failure: E_FAIL, If any arguments are invalid, error occurred, or Explorer
* does not contain the setting.
* E_INVALIDARG, If the buffer is not big enough
*/
HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
{
static const WCHAR szkeyW[] = {
'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','\\',
'I','n','t','e','r','n','a','t','i','o','n','a','l',0};
static const WCHAR valueW[] = {
'A','c','c','e','p','t','L','a','n','g','u','a','g','e',0};
static const WCHAR enusW[] = {'e','n','-','u','s',0};
DWORD mystrlen, mytype;
HKEY mykey;
HRESULT retval;
LCID mylcid;
WCHAR *mystr;
if(!langbuf || !buflen || !*buflen)
return E_FAIL;
mystrlen = (*buflen > 20) ? *buflen : 20 ;
mystr = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * mystrlen);
RegOpenKeyW(HKEY_CURRENT_USER, szkeyW, &mykey);
if(RegQueryValueExW(mykey, valueW, 0, &mytype, (PBYTE)mystr, &mystrlen)) {
/* Did not find value */
mylcid = GetUserDefaultLCID();
/* somehow the mylcid translates into "en-us"
* this is similar to "LOCALE_SABBREVLANGNAME"
* which could be gotten via GetLocaleInfo.
* The only problem is LOCALE_SABBREVLANGUAGE" is
* a 3 char string (first 2 are country code and third is
* letter for "sublanguage", which does not come close to
* "en-us"
*/
lstrcpyW(mystr, enusW);
mystrlen = lstrlenW(mystr);
} else {
/* handle returned string */
FIXME("missing code\n");
}
memcpy( langbuf, mystr, min(*buflen,strlenW(mystr)+1)*sizeof(WCHAR) );
if(*buflen > strlenW(mystr)) {
*buflen = strlenW(mystr);
retval = S_OK;
} else {
*buflen = 0;
retval = E_INVALIDARG;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
}
RegCloseKey(mykey);
HeapFree(GetProcessHeap(), 0, mystr);
return retval;
}
/*************************************************************************
* @ [SHLWAPI.14]
*
* Ascii version of GetAcceptLanguagesW.
*/
HRESULT WINAPI GetAcceptLanguagesA( LPSTR langbuf, LPDWORD buflen)
{
WCHAR *langbufW;
DWORD buflenW, convlen;
HRESULT retval;
if(!langbuf || !buflen || !*buflen) return E_FAIL;
buflenW = *buflen;
langbufW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * buflenW);
retval = GetAcceptLanguagesW(langbufW, &buflenW);
/* FIXME: this is wrong, the string may not be null-terminated */
convlen = WideCharToMultiByte(CP_ACP, 0, langbufW, -1, langbuf,
*buflen, NULL, NULL);
*buflen = buflenW ? convlen : 0;
HeapFree(GetProcessHeap(), 0, langbufW);
return retval;
}
/*************************************************************************
* @ [SHLWAPI.23]
*
* Convert a GUID to a string.
*
* PARAMS
* guid [I] GUID to convert
* lpszDest [O] Destination for string
* cchMax [I] Length of output buffer
*
* RETURNS
* The length of the string created.
*/
INT WINAPI SHStringFromGUIDA(REFGUID guid, LPSTR lpszDest, INT cchMax)
{
char xguid[40];
INT iLen;
TRACE("(%s,%p,%d)\n", debugstr_guid(guid), lpszDest, cchMax);
sprintf(xguid, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
guid->Data1, guid->Data2, guid->Data3,
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
iLen = strlen(xguid) + 1;
if (iLen > cchMax)
return 0;
memcpy(lpszDest, xguid, iLen);
return iLen;
}
/*************************************************************************
* @ [SHLWAPI.24]
*
* Convert a GUID to a string.
*
* PARAMS
* guid [I] GUID to convert
* str [O] Destination for string
* cmax [I] Length of output buffer
*
* RETURNS
* The length of the string created.
*/
INT WINAPI SHStringFromGUIDW(REFGUID guid, LPWSTR lpszDest, INT cchMax)
{
WCHAR xguid[40];
INT iLen;
static const WCHAR wszFormat[] = {'{','%','0','8','l','X','-','%','0','4','X','-','%','0','4','X','-',
'%','0','2','X','%','0','2','X','-','%','0','2','X','%','0','2','X','%','0','2','X','%','0','2',
'X','%','0','2','X','%','0','2','X','}',0};
TRACE("(%s,%p,%d)\n", debugstr_guid(guid), lpszDest, cchMax);
sprintfW(xguid, wszFormat, guid->Data1, guid->Data2, guid->Data3,
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
iLen = strlenW(xguid) + 1;
if (iLen > cchMax)
return 0;
memcpy(lpszDest, xguid, iLen*sizeof(WCHAR));
return iLen;
}
/*************************************************************************
* @ [SHLWAPI.29]
*
* Determine if a Unicode character is a space.
*
* PARAMS
* wc [I] Character to check.
*
* RETURNS
* TRUE, if wc is a space,
* FALSE otherwise.
*/
BOOL WINAPI IsCharSpaceW(WCHAR wc)
{
WORD CharType;
return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_SPACE);
}
/*************************************************************************
* @ [SHLWAPI.30]
*
* Determine if a Unicode character is a blank.
*
* PARAMS
* wc [I] Character to check.
*
* RETURNS
* TRUE, if wc is a blank,
* FALSE otherwise.
*
*/
BOOL WINAPI IsCharBlankW(WCHAR wc)
{
WORD CharType;
return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_BLANK);
}
/*************************************************************************
* @ [SHLWAPI.31]
*
* Determine if a Unicode character is punctuation.
*
* PARAMS
* wc [I] Character to check.
*
* RETURNS
* TRUE, if wc is punctuation,
* FALSE otherwise.
*/
BOOL WINAPI IsCharPunctW(WCHAR wc)
{
WORD CharType;
return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_PUNCT);
}
/*************************************************************************
* @ [SHLWAPI.32]
*
* Determine if a Unicode character is a control character.
*
* PARAMS
* wc [I] Character to check.
*
* RETURNS
* TRUE, if wc is a control character,
* FALSE otherwise.
*/
BOOL WINAPI IsCharCntrlW(WCHAR wc)
{
WORD CharType;
return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_CNTRL);
}
/*************************************************************************
* @ [SHLWAPI.33]
*
* Determine if a Unicode character is a digit.
*
* PARAMS
* wc [I] Character to check.
*
* RETURNS
* TRUE, if wc is a digit,
* FALSE otherwise.
*/
BOOL WINAPI IsCharDigitW(WCHAR wc)
{
WORD CharType;
return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_DIGIT);
}
/*************************************************************************
* @ [SHLWAPI.34]
*
* Determine if a Unicode character is a hex digit.
*
* PARAMS
* wc [I] Character to check.
*
* RETURNS
* TRUE, if wc is a hex digit,
* FALSE otherwise.
*/
BOOL WINAPI IsCharXDigitW(WCHAR wc)
{
WORD CharType;
return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_XDIGIT);
}
/*************************************************************************
* @ [SHLWAPI.35]
*
*/
BOOL WINAPI GetStringType3ExW(LPWSTR lpszStr, DWORD dwLen, LPVOID p3)
{
FIXME("(%s,0x%08x,%p): stub\n", debugstr_w(lpszStr), dwLen, p3);
return TRUE;
}
/*************************************************************************
* @ [SHLWAPI.36]
*
* Insert a bitmap menu item at the bottom of a menu.
*
* PARAMS
* hMenu [I] Menu to insert into
* flags [I] Flags for insertion
* id [I] Menu ID of the item
* str [I] Menu text for the item
*
* RETURNS
* Success: TRUE, the item is inserted into the menu
* Failure: FALSE, if any parameter is invalid
*/
BOOL WINAPI AppendMenuWrapW(HMENU hMenu, UINT flags, UINT id, LPCWSTR str)
{
TRACE("(%p,0x%08x,0x%08x,%s)\n",hMenu, flags, id, debugstr_w(str));
return InsertMenuW(hMenu, -1, flags | MF_BITMAP, id, str);
}
/*************************************************************************
* @ [SHLWAPI.138]
*
* Set the text of a given dialog item.
*
* PARAMS
* hWnd [I] Handle of dialog
* iItem [I] Index of item
* lpszText [O] Text to set
*
* RETURNS
* Success: TRUE. The text of the dialog is set to lpszText.
* Failure: FALSE, Otherwise.
*/
BOOL WINAPI SetDlgItemTextWrapW(HWND hWnd, INT iItem, LPCWSTR lpszText)
{
HWND hWndItem = GetDlgItem(hWnd, iItem);
if (hWndItem)
return SetWindowTextW(hWndItem, lpszText);
return FALSE;
}
/*************************************************************************
* @ [SHLWAPI.151]
*
* Compare two Ascii strings up to a given length.
*
* PARAMS
* lpszSrc [I] Source string
* lpszCmp [I] String to compare to lpszSrc
* len [I] Maximum length
*
* RETURNS
* A number greater than, less than or equal to 0 depending on whether
* lpszSrc is greater than, less than or equal to lpszCmp.
*/
DWORD WINAPI StrCmpNCA(LPCSTR lpszSrc, LPCSTR lpszCmp, INT len)
{
return strncmp(lpszSrc, lpszCmp, len);
}
/*************************************************************************
* @ [SHLWAPI.152]
*
* Unicode version of StrCmpNCA.
*/
DWORD WINAPI StrCmpNCW(LPCWSTR lpszSrc, LPCWSTR lpszCmp, INT len)
{
return strncmpW(lpszSrc, lpszCmp, len);
}
/*************************************************************************
* @ [SHLWAPI.153]
*
* Compare two Ascii strings up to a given length, ignoring case.
*
* PARAMS
* lpszSrc [I] Source string
* lpszCmp [I] String to compare to lpszSrc
* len [I] Maximum length
*
* RETURNS
* A number greater than, less than or equal to 0 depending on whether
* lpszSrc is greater than, less than or equal to lpszCmp.
*/
DWORD WINAPI StrCmpNICA(LPCSTR lpszSrc, LPCSTR lpszCmp, DWORD len)
{
return strncasecmp(lpszSrc, lpszCmp, len);
}
/*************************************************************************
* @ [SHLWAPI.154]
*
* Unicode version of StrCmpNICA.
*/
DWORD WINAPI StrCmpNICW(LPCWSTR lpszSrc, LPCWSTR lpszCmp, DWORD len)
{
return strncmpiW(lpszSrc, lpszCmp, len);
}
/*************************************************************************
* @ [SHLWAPI.155]
*
* Compare two Ascii strings.
*
* PARAMS
* lpszSrc [I] Source string
* lpszCmp [I] String to compare to lpszSrc
*
* RETURNS
* A number greater than, less than or equal to 0 depending on whether
* lpszSrc is greater than, less than or equal to lpszCmp.
*/
DWORD WINAPI StrCmpCA(LPCSTR lpszSrc, LPCSTR lpszCmp)
{
return strcmp(lpszSrc, lpszCmp);
}
/*************************************************************************
* @ [SHLWAPI.156]
*
* Unicode version of StrCmpCA.
*/
DWORD WINAPI StrCmpCW(LPCWSTR lpszSrc, LPCWSTR lpszCmp)
{
return strcmpW(lpszSrc, lpszCmp);
}
/*************************************************************************
* @ [SHLWAPI.157]
*
* Compare two Ascii strings, ignoring case.
*
* PARAMS
* lpszSrc [I] Source string
* lpszCmp [I] String to compare to lpszSrc
*
* RETURNS
* A number greater than, less than or equal to 0 depending on whether
* lpszSrc is greater than, less than or equal to lpszCmp.
*/
DWORD WINAPI StrCmpICA(LPCSTR lpszSrc, LPCSTR lpszCmp)
{
return strcasecmp(lpszSrc, lpszCmp);
}
/*************************************************************************
* @ [SHLWAPI.158]
*
* Unicode version of StrCmpICA.
*/
DWORD WINAPI StrCmpICW(LPCWSTR lpszSrc, LPCWSTR lpszCmp)
{
return strcmpiW(lpszSrc, lpszCmp);
}
/*************************************************************************
* @ [SHLWAPI.160]
*
* Get an identification string for the OS and explorer.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -