return p;\r
}\r
\r
+// マルチバイト文字列の冗長表現を修正\r
+// 修正があればTRUEを返す\r
+// 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能\r
+BOOL FixStringM(LPSTR pDst, LPCSTR pSrc)\r
+{\r
+ BOOL bResult;\r
+ char* p;\r
+ DWORD Code;\r
+ int i;\r
+ char c;\r
+ bResult = FALSE;\r
+ p = (char*)pSrc;\r
+ while(*pSrc != '\0')\r
+ {\r
+ Code = 0;\r
+ if((*pSrc & 0xfe) == 0xfc)\r
+ {\r
+ i = 5;\r
+ Code |= (DWORD)*pSrc & 0x01;\r
+ }\r
+ else if((*pSrc & 0xfc) == 0xf8)\r
+ {\r
+ i = 4;\r
+ Code |= (DWORD)*pSrc & 0x03;\r
+ }\r
+ else if((*pSrc & 0xf8) == 0xf0)\r
+ {\r
+ i = 3;\r
+ Code |= (DWORD)*pSrc & 0x07;\r
+ }\r
+ else if((*pSrc & 0xf0) == 0xe0)\r
+ {\r
+ i = 2;\r
+ Code |= (DWORD)*pSrc & 0x0f;\r
+ }\r
+ else if((*pSrc & 0xe0) == 0xc0)\r
+ {\r
+ i = 1;\r
+ Code |= (DWORD)*pSrc & 0x1f;\r
+ }\r
+ else if((*pSrc & 0x80) == 0x00)\r
+ {\r
+ i = 0;\r
+ Code |= (DWORD)*pSrc & 0x7f;\r
+ }\r
+ else\r
+ i = -1;\r
+ pSrc++;\r
+ while((*pSrc & 0xc0) == 0x80)\r
+ {\r
+ i--;\r
+ Code = Code << 6;\r
+ Code |= (DWORD)*pSrc & 0x3f;\r
+ pSrc++;\r
+ }\r
+ if(i != 0)\r
+ continue;\r
+ else if(Code & 0x7c000000)\r
+ {\r
+ i = 5;\r
+ c = (char)(0xfc | (Code >> (6 * i)));\r
+ }\r
+ else if(Code & 0x03e00000)\r
+ {\r
+ i = 4;\r
+ c = (char)(0xf8 | (Code >> (6 * i)));\r
+ }\r
+ else if(Code & 0x001f0000)\r
+ {\r
+ i = 3;\r
+ c = (char)(0xf0 | (Code >> (6 * i)));\r
+ }\r
+ else if(Code & 0x0000f800)\r
+ {\r
+ i = 2;\r
+ c = (char)(0xe0 | (Code >> (6 * i)));\r
+ }\r
+ else if(Code & 0x00000780)\r
+ {\r
+ i = 1;\r
+ c = (char)(0xc0 | (Code >> (6 * i)));\r
+ }\r
+ else\r
+ {\r
+ i = 0;\r
+ c = (char)Code;\r
+ }\r
+ if(c != *p)\r
+ bResult = TRUE;\r
+ p++;\r
+ *pDst = c;\r
+ pDst++;\r
+ while(i > 0)\r
+ {\r
+ i--;\r
+ c = (char)(0x80 | ((Code >> (6 * i)) & 0x3f));\r
+ if(c != *p)\r
+ bResult = TRUE;\r
+ p++;\r
+ *pDst = c;\r
+ pDst++;\r
+ }\r
+ }\r
+ if(*p != '\0')\r
+ bResult = TRUE;\r
+ *pDst = '\0';\r
+ return bResult;\r
+}\r
+\r
+// NULL区切りマルチバイト文字列の冗長表現を修正\r
+// 修正があればTRUEを返す\r
+// 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能\r
+BOOL FixMultiStringM(LPSTR pDst, LPCSTR pSrc)\r
+{\r
+ BOOL bResult;\r
+ int Length;\r
+ bResult = FALSE;\r
+ while(*pSrc != '\0')\r
+ {\r
+ Length = strlen(pSrc) + 1;\r
+ bResult = bResult | FixStringM(pDst, pSrc);\r
+ pSrc += Length;\r
+ pDst += strlen(pDst) + 1;\r
+ }\r
+ *pDst = '\0';\r
+ return bResult;\r
+}\r
+\r
+// マルチバイト文字列の冗長表現を確認\r
+// 冗長表現があればTRUEを返す\r
+BOOL CheckStringM(LPCSTR lpString)\r
+{\r
+ BOOL bResult;\r
+ char* p;\r
+ bResult = FALSE;\r
+ p = AllocateStringM(strlen(lpString) + 1);\r
+ if(p)\r
+ {\r
+ bResult = FixStringM(p, lpString);\r
+ FreeDuplicatedString(p);\r
+ }\r
+ return bResult;\r
+}\r
+\r
+// NULL区切りマルチバイト文字列の冗長表現を確認\r
+// 冗長表現があればTRUEを返す\r
+BOOL CheckMultiStringM(LPCSTR lpString)\r
+{\r
+ BOOL bResult;\r
+ char* p;\r
+ bResult = FALSE;\r
+ p = AllocateStringM(GetMultiStringLengthM(lpString) + 1);\r
+ if(p)\r
+ {\r
+ bResult = FixMultiStringM(p, lpString);\r
+ FreeDuplicatedString(p);\r
+ }\r
+ return bResult;\r
+}\r
+\r
// 文字列用に確保したメモリを開放\r
// リソースIDならば何もしない\r
void FreeDuplicatedString(void* p)\r
return r;\r
}\r
\r
+BOOL ShellExecuteExM(LPSHELLEXECUTEINFOA lpExecInfo)\r
+{\r
+ BOOL r = FALSE;\r
+ wchar_t* pw0 = NULL;\r
+ wchar_t* pw1 = NULL;\r
+ wchar_t* pw2 = NULL;\r
+ wchar_t* pw3 = NULL;\r
+ wchar_t* pw4 = NULL;\r
+ SHELLEXECUTEINFOW wExecInfo;\r
+START_ROUTINE\r
+ wExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);\r
+ wExecInfo.fMask = lpExecInfo->fMask;\r
+ wExecInfo.hwnd = lpExecInfo->hwnd;\r
+ pw0 = DuplicateMtoW(lpExecInfo->lpVerb, -1);\r
+ wExecInfo.lpVerb = pw0;\r
+ pw1 = DuplicateMtoW(lpExecInfo->lpFile, -1);\r
+ wExecInfo.lpFile = pw1;\r
+ pw2 = DuplicateMtoW(lpExecInfo->lpParameters, -1);\r
+ wExecInfo.lpParameters = pw2;\r
+ pw3 = DuplicateMtoW(lpExecInfo->lpDirectory, -1);\r
+ wExecInfo.lpDirectory = pw3;\r
+ wExecInfo.nShow = lpExecInfo->nShow;\r
+ wExecInfo.hInstApp = lpExecInfo->hInstApp;\r
+ wExecInfo.lpIDList = lpExecInfo->lpIDList;\r
+ if(lpExecInfo->fMask & SEE_MASK_CLASSNAME)\r
+ {\r
+ pw4 = DuplicateMtoW(lpExecInfo->lpClass, -1);\r
+ wExecInfo.lpClass = pw4;\r
+ }\r
+ wExecInfo.hkeyClass = lpExecInfo->hkeyClass;\r
+ wExecInfo.dwHotKey = lpExecInfo->dwHotKey;\r
+ wExecInfo.hIcon = lpExecInfo->hIcon;\r
+ wExecInfo.hProcess = lpExecInfo->hProcess;\r
+ r = ShellExecuteExW(&wExecInfo);\r
+ lpExecInfo->hInstApp = wExecInfo.hInstApp;\r
+ lpExecInfo->hProcess = wExecInfo.hProcess;\r
+END_ROUTINE\r
+ FreeDuplicatedString(pw0);\r
+ FreeDuplicatedString(pw1);\r
+ FreeDuplicatedString(pw2);\r
+ FreeDuplicatedString(pw3);\r
+ FreeDuplicatedString(pw4);\r
+ return r;\r
+}\r
+\r
PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi)\r
{\r
PIDLIST_ABSOLUTE r = NULL;\r
\r
BOOL sndPlaySoundM(LPCSTR pszSound, UINT fuSound)\r
{\r
- HWND r = NULL;\r
+ BOOL r = FALSE;\r
wchar_t* pw0 = NULL;\r
START_ROUTINE\r
pw0 = DuplicateMtoW(pszSound, -1);\r
return r;\r
}\r
\r
+HANDLE SetClipboardDataM(UINT uFormat, HANDLE hMem)\r
+{\r
+ HANDLE r = NULL;\r
+ char* p;\r
+ int Length;\r
+ int BufferLength;\r
+ HGLOBAL hBufferMem;\r
+START_ROUTINE\r
+ if(uFormat == CF_TEXT)\r
+ {\r
+ p = (char*)GlobalLock(hMem);\r
+ Length = (int)GlobalSize(hMem);\r
+ BufferLength = MtoW(NULL, 0, p, Length);\r
+ if(hBufferMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(wchar_t) * BufferLength))\r
+ {\r
+ MtoW((LPWSTR)GlobalLock(hBufferMem), BufferLength, p, Length);\r
+ GlobalUnlock(hBufferMem);\r
+ r = SetClipboardData(CF_UNICODETEXT, hBufferMem);\r
+ }\r
+ GlobalUnlock(hMem);\r
+ GlobalFree(hMem);\r
+ }\r
+ else\r
+ r = SetClipboardData(uFormat, hMem);\r
+END_ROUTINE\r
+ return r;\r
+}\r
+\r
+BOOL CopyFileM(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists)\r
+{\r
+ BOOL r = FALSE;\r
+ wchar_t* pw0 = NULL;\r
+ wchar_t* pw1 = NULL;\r
+START_ROUTINE\r
+ pw0 = DuplicateMtoW(lpExistingFileName, -1);\r
+ pw1 = DuplicateMtoW(lpNewFileName, -1);\r
+ r = CopyFileW(pw0, pw1, bFailIfExists);\r
+END_ROUTINE\r
+ FreeDuplicatedString(pw0);\r
+ FreeDuplicatedString(pw1);\r
+ return r;\r
+}\r
+\r
int mkdirM(const char * _Path)\r
{\r
int r = 0;\r