-// mbswrapper.cpp
+// mbswrapper.c
// Copyright (C) 2011 Suguru Kawamoto
-// \83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\83\8f\83C\83h\95¶\8e\9aAPI\83\89\83b\83p\81[
-// \83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\82ÍUTF-8\81A\83\8f\83C\83h\95¶\8e\9a\82ÍUTF-16\82Å\82 \82é\82à\82Ì\82Æ\82·\82é
-// \91S\82Ä\82Ì\90§\8cä\97p\82Ì\95¶\8e\9a\82ÍASCII\82Ì\94Í\88Í\82Å\82 \82é\82½\82ß\81AShift_JIS\82ÆUTF-8\8aÔ\82Ì\95Ï\8a·\82Í\95s\97v
+// マルチバイト文字ワイド文字APIラッパー
+// マルチバイト文字はUTF-8、ワイド文字はUTF-16であるものとする
+// 全ての制御用の文字はASCIIの範囲であるため、Shift_JISとUTF-8間の変換は不要
#define UNICODE
#define _UNICODE
-#define _WIN32_WINNT 0x0600
-#undef _WIN32_IE
-#define _WIN32_IE 0x0400
#include <tchar.h>
#include <direct.h>
#define DO_NOT_REPLACE
#include "mbswrapper.h"
-// \83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82©\82ç\83\8f\83C\83h\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// マルチバイト文字列からワイド文字列へ変換
int MtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
{
if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
- return pSrc;
+ return 0;
if(pDst)
return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, pDst, size);
return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, NULL, 0);
}
-// \83\8f\83C\83h\95¶\8e\9a\97ñ\82©\82ç\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// ワイド文字列からマルチバイト文字列へ変換
int WtoM(LPSTR pDst, int size, LPCWSTR pSrc, int count)
{
if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
- return pSrc;
+ return 0;
if(pDst)
return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, pDst, size, NULL, NULL);
return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, NULL, 0, NULL, NULL);
}
-// \83\8f\83C\83h\95¶\8e\9a\97ñ\82©\82çShift_JIS\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// Shift_JIS文字列からワイド文字列へ変換
+int AtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
+{
+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
+ return 0;
+ if(pDst)
+ return MultiByteToWideChar(CP_ACP, 0, pSrc, count, pDst, size);
+ return MultiByteToWideChar(CP_ACP, 0, pSrc, count, NULL, 0);
+}
+
+// ワイド文字列からShift_JIS文字列へ変換
int WtoA(LPSTR pDst, int size, LPCWSTR pSrc, int count)
{
if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
- return pSrc;
+ return 0;
if(pDst)
return WideCharToMultiByte(CP_ACP, 0, pSrc, count, pDst, size, NULL, NULL);
return WideCharToMultiByte(CP_ACP, 0, pSrc, count, NULL, 0, NULL, NULL);
}
-// \83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\83o\83b\83t\83@\8fI\92[\82ð\8b\90§\93I\82ÉNULL\82Å\92u\8a·
+// マルチバイト文字列バッファ終端を強制的にNULLで置換
int TerminateStringM(LPSTR lpString, int size)
{
int i;
return i;
}
-// \83\8f\83C\83h\95¶\8e\9a\97ñ\83o\83b\83t\83@\8fI\92[\82ð\8b\90§\93I\82ÉNULL\82Å\92u\8a·
+// ワイド文字列バッファ終端を強制的にNULLで置換
int TerminateStringW(LPWSTR lpString, int size)
{
int i;
return i;
}
-// NULL\8bæ\90Ø\82è\95¡\90\94\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82Ì\92·\82³\82ð\8eæ\93¾
+// Shift_JIS文字列バッファ終端を強制的にNULLで置換
+int TerminateStringA(LPSTR lpString, int size)
+{
+ int i;
+ if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
+ return 0;
+ for(i = 0; i < size; i++)
+ {
+ if(lpString[i] == '\0')
+ return i;
+ }
+ i--;
+ lpString[i] = '\0';
+ return i;
+}
+
+// NULL区切り複数マルチバイト文字列の長さを取得
size_t GetMultiStringLengthM(LPCSTR lpString)
{
size_t i;
return i;
}
-// NULL\8bæ\90Ø\82è\95¡\90\94\83\8f\83C\83h\95¶\8e\9a\97ñ\82Ì\92·\82³\82ð\8eæ\93¾
+// NULL区切り複数ワイド文字列の長さを取得
size_t GetMultiStringLengthW(LPCWSTR lpString)
{
size_t i;
return i;
}
-// \83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\97p\82Ì\83\81\83\82\83\8a\82ð\8am\95Û
+// NULL区切り複数Shift_JIS文字列の長さを取得
+size_t GetMultiStringLengthA(LPCSTR lpString)
+{
+ size_t i;
+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
+ return 0;
+ i = 0;
+ while(lpString[i] != '\0' || lpString[i + 1] != '\0')
+ {
+ i++;
+ }
+ i++;
+ return i;
+}
+
+// NULL区切りマルチバイト文字列からワイド文字列へ変換
+int MtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
+{
+ int i;
+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
+ return 0;
+ if(!pDst)
+ return GetMultiStringLengthM(pSrc);
+ i = 0;
+ while(*pSrc != '\0')
+ {
+ i += MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1);
+ pSrc += strlen(pSrc) + 1;
+ }
+ pDst[i] = L'\0';
+ return i;
+}
+
+// NULL区切りワイド文字列からマルチバイト文字列へ変換
+int WtoMMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
+{
+ int i;
+ if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
+ return 0;
+ if(!pDst)
+ return GetMultiStringLengthW(pSrc);
+ i = 0;
+ while(*pSrc != L'\0')
+ {
+ i += WideCharToMultiByte(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
+ pSrc += wcslen(pSrc) + 1;
+ }
+ pDst[i] = '\0';
+ return i;
+}
+
+// NULL区切りShift_JIS文字列からワイド文字列へ変換
+int AtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
+{
+ int i;
+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
+ return 0;
+ if(!pDst)
+ return GetMultiStringLengthA(pSrc);
+ i = 0;
+ while(*pSrc != '\0')
+ {
+ i += MultiByteToWideChar(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1);
+ pSrc += strlen(pSrc) + 1;
+ }
+ pDst[i] = L'\0';
+ return i;
+}
+
+// NULL区切りワイド文字列からShift_JIS文字列へ変換
+int WtoAMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
+{
+ int i;
+ if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
+ return 0;
+ if(!pDst)
+ return GetMultiStringLengthW(pSrc);
+ i = 0;
+ while(*pSrc != L'\0')
+ {
+ i += WideCharToMultiByte(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
+ pSrc += wcslen(pSrc) + 1;
+ }
+ pDst[i] = '\0';
+ return i;
+}
+
+// マルチバイト文字列用のメモリを確保
char* AllocateStringM(int size)
{
char* p;
- // 0\82ª\8ew\92è\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\82½\82ß1\95¶\8e\9a\95ª\92Ç\89Á
+ // 0が指定される場合があるため1文字分追加
p = (char*)malloc(sizeof(char) * (size + 1));
- // \94O\82Ì\82½\82ß\90æ\93ª\82ÉNULL\95¶\8e\9a\82ð\91ã\93ü
+ // 念のため先頭にNULL文字を代入
if(p)
*p = '\0';
return p;
}
-// \83\8f\83C\83h\95¶\8e\9a\97ñ\97p\82Ì\83\81\83\82\83\8a\82ð\8am\95Û
+// ワイド文字列用のメモリを確保
wchar_t* AllocateStringW(int size)
{
wchar_t* p;
- // 0\82ª\8ew\92è\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\82½\82ß1\95¶\8e\9a\95ª\92Ç\89Á
+ // 0が指定される場合があるため1文字分追加
p = (wchar_t*)malloc(sizeof(wchar_t) * (size + 1));
- // \94O\82Ì\82½\82ß\90æ\93ª\82ÉNULL\95¶\8e\9a\82ð\91ã\93ü
+ // 念のため先頭にNULL文字を代入
if(p)
*p = L'\0';
return p;
}
-// Shift_JIS\95¶\8e\9a\97ñ\97p\82Ì\83\81\83\82\83\8a\82ð\8am\95Û
+// Shift_JIS文字列用のメモリを確保
char* AllocateStringA(int size)
{
char* p;
- // 0\82ª\8ew\92è\82³\82ê\82é\8fê\8d\87\82ª\82 \82é\82½\82ß1\95¶\8e\9a\95ª\92Ç\89Á
+ // 0が指定される場合があるため1文字分追加
p = (char*)malloc(sizeof(char) * (size + 1));
- // \94O\82Ì\82½\82ß\90æ\93ª\82ÉNULL\95¶\8e\9a\82ð\91ã\93ü
+ // 念のため先頭にNULL文字を代入
if(p)
*p = '\0';
return p;
}
-// \83\81\83\82\83\8a\82ð\8am\95Û\82µ\82Ä\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82©\82ç\83\8f\83C\83h\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// メモリを確保してマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
wchar_t* DuplicateMtoW(LPCSTR lpString, int c)
{
wchar_t* p;
return p;
}
-// \8ew\92è\82µ\82½\83T\83C\83Y\82Ì\83\81\83\82\83\8a\82ð\8am\95Û\82µ\82Ä\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82©\82ç\83\8f\83C\83h\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// 指定したサイズのメモリを確保してマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size)
{
wchar_t* p;
return p;
}
-// \83\81\83\82\83\8a\82ð\8am\95Û\82µ\82ÄNULL\8bæ\90Ø\82è\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82©\82ç\83\8f\83C\83h\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// メモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
wchar_t* DuplicateMtoWMultiString(LPCSTR lpString)
{
int count;
return p;
}
-// \8ew\92è\82µ\82½\83T\83C\83Y\82Ì\83\81\83\82\83\8a\82ð\8am\95Û\82µ\82ÄNULL\8bæ\90Ø\82è\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82©\82ç\83\8f\83C\83h\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// 指定したサイズのメモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size)
{
int count;
return p;
}
-// \83\81\83\82\83\8a\82ð\8am\95Û\82µ\82Ä\83\8f\83C\83h\95¶\8e\9a\97ñ\82©\82ç\83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// メモリを確保してワイド文字列からマルチバイト文字列へ変換
+// リソースIDならば元の値を返す
char* DuplicateWtoM(LPCWSTR lpString, int c)
{
char* p;
return p;
}
-// \83\81\83\82\83\8a\82ð\8am\95Û\82µ\82Ä\83\8f\83C\83h\95¶\8e\9a\97ñ\82©\82çShift_JIS\95¶\8e\9a\97ñ\82Ö\95Ï\8a·
+// メモリを確保してShift_JIS文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
+wchar_t* DuplicateAtoW(LPCSTR lpString, int c)
+{
+ wchar_t* p;
+ int i;
+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
+ return (wchar_t*)lpString;
+ if(c < 0)
+ c = strlen(lpString);
+ p = AllocateStringW(AtoW(NULL, 0, lpString, c) + 1);
+ if(p)
+ {
+ i = AtoW(p, 65535, lpString, c);
+ p[i] = L'\0';
+ }
+ return p;
+}
+
+// メモリを確保してワイド文字列からShift_JIS文字列へ変換
+// リソースIDならば元の値を返す
char* DuplicateWtoA(LPCWSTR lpString, int c)
{
char* p;
return p;
}
-// \95¶\8e\9a\97ñ\97p\82É\8am\95Û\82µ\82½\83\81\83\82\83\8a\82ð\8aJ\95ú
+// 文字列用に確保したメモリを開放
+// リソースIDならば何もしない
void FreeDuplicatedString(void* p)
{
if(p < (void*)0x00010000 || p == (void*)~0)
free(p);
}
-// \88È\89º\83\89\83b\83p\81[
-// \96ß\82è\92l\83o\83b\83t\83@ r
-// \83\8f\83C\83h\95¶\8e\9a\83o\83b\83t\83@ pw%d
-// \83}\83\8b\83`\83o\83C\83g\95¶\8e\9a\83o\83b\83t\83@ pm%d
-// \88ø\90\94\83o\83b\83t\83@ a%d
+// 以下ラッパー
+// 戻り値バッファ r
+// ワイド文字バッファ pw%d
+// マルチバイト文字バッファ pm%d
+// 引数バッファ a%d
+#pragma warning(disable:4102)
#define START_ROUTINE do{
#define END_ROUTINE }while(0);end_of_routine:
#define QUIT_ROUTINE goto end_of_routine;
+int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
+{
+ int r = 0;
+ char* pm0 = NULL;
+START_ROUTINE
+ pm0 = DuplicateWtoM(lpCmdLine, -1);
+ r = WinMainM(hInstance, hPrevInstance, pm0, nCmdShow);
+END_ROUTINE
+ FreeDuplicatedString(pm0);
+ return r;
+}
+
+HMODULE LoadLibraryM(LPCSTR lpLibFileName)
+{
+ HMODULE r = NULL;
+ wchar_t* pw0 = NULL;
+START_ROUTINE
+ pw0 = DuplicateMtoW(lpLibFileName, -1);
+ r = LoadLibraryW(pw0);
+END_ROUTINE
+ FreeDuplicatedString(pw0);
+ return r;
+}
+
HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
HANDLE r = INVALID_HANDLE_VALUE;
START_ROUTINE
pw0 = AllocateStringW(nBufferLength * 4);
GetLogicalDriveStringsW(nBufferLength * 4, pw0);
- WtoM(lpBuffer, nBufferLength, pw0, -1);
+ WtoMMultiString(lpBuffer, nBufferLength, pw0);
r = TerminateStringM(lpBuffer, nBufferLength);
END_ROUTINE
FreeDuplicatedString(pw0);
ATOM RegisterClassExM(CONST WNDCLASSEXA * v0)
{
- LRESULT r = 0;
+ ATOM r = 0;
START_ROUTINE
- // WNDPROC\82ªShift_JIS\97p\82Å\82 \82é\82½\82ß
+ // WNDPROCがShift_JIS用であるため
r = RegisterClassExA(v0);
END_ROUTINE
return r;
{
LRESULT r = 0;
START_ROUTINE
- // WNDPROC\82ªShift_JIS\97p\82Å\82 \82é\82½\82ß
+ // WNDPROCがShift_JIS用であるため
if(IsWindowUnicode(hWnd))
r = GetWindowLongW(hWnd, nIndex);
else
{
LRESULT r = 0;
START_ROUTINE
- // WNDPROC\82ªShift_JIS\97p\82Å\82 \82é\82½\82ß
+ // WNDPROCがShift_JIS用であるため
if(IsWindowUnicode(hWnd))
r = SetWindowLongW(hWnd, nIndex, dwNewLong);
else
{
LRESULT r = 0;
START_ROUTINE
- // WNDPROC\82ªShift_JIS\97p\82Å\82 \82é\82½\82ß
+ // WNDPROCがShift_JIS用であるため
if(IsWindowUnicode(hWnd))
r = DefWindowProcW(hWnd, Msg, wParam, lParam);
else
{
LRESULT r = 0;
START_ROUTINE
- // WNDPROC\82ªShift_JIS\97p\82Å\82 \82é\82½\82ß
+ // WNDPROCがShift_JIS用であるため
if(IsWindowUnicode(hWnd))
r = CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
else
r = TerminateStringM((LPSTR)lParam, wParam);
break;
case WM_GETTEXTLENGTH:
- Size = SendMessageW(hWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
+ Size = SendMessageW(hWnd, WM_GETTEXTLENGTH, wParam, lParam) + 1;
pw0 = AllocateStringW(Size);
SendMessageW(hWnd, WM_GETTEXT, (WPARAM)Size, (LPARAM)pw0);
r = WtoM(NULL, 0, pw0, -1) - 1;
Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
pw0 = AllocateStringW(Size);
SendMessageW(hWnd, CB_GETLBTEXT, wParam, (LPARAM)pw0);
- // \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
+ // バッファ長不明のためオーバーランの可能性あり
WtoM((LPSTR)lParam, Size * 4, pw0, -1);
r = TerminateStringM((LPSTR)lParam, Size * 4);
break;
Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
pw0 = AllocateStringW(Size);
SendMessageW(hWnd, LB_GETTEXT, wParam, (LPARAM)pw0);
- // \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
+ // バッファ長不明のためオーバーランの可能性あり
WtoM((LPSTR)lParam, Size * 4, pw0, -1);
r = TerminateStringM((LPSTR)lParam, Size * 4);
break;
wLVItem.iSubItem = pmLVItem->iSubItem;
wLVItem.state = pmLVItem->state;
wLVItem.stateMask = pmLVItem->stateMask;
- Size = pmLVItem->cchTextMax * 4;
- pw0 = AllocateStringW(Size);
- wLVItem.pszText = pw0;
- wLVItem.cchTextMax = Size;
+ if(pmLVItem->mask & LVIF_TEXT)
+ {
+ Size = pmLVItem->cchTextMax * 4;
+ pw0 = AllocateStringW(Size);
+ wLVItem.pszText = pw0;
+ wLVItem.cchTextMax = Size;
+ }
wLVItem.iImage = pmLVItem->iImage;
wLVItem.lParam = pmLVItem->lParam;
wLVItem.iIndent = pmLVItem->iIndent;
pmLVItem->iSubItem = wLVItem.iSubItem;
pmLVItem->state = wLVItem.state;
pmLVItem->stateMask = wLVItem.stateMask;
- WtoM(pmLVItem->pszText, pmLVItem->cchTextMax, wLVItem.pszText, -1);
- TerminateStringM(pmLVItem->pszText, pmLVItem->cchTextMax);
+ if(pmLVItem->mask & LVIF_TEXT)
+ {
+ WtoM(pmLVItem->pszText, pmLVItem->cchTextMax, wLVItem.pszText, -1);
+ TerminateStringM(pmLVItem->pszText, pmLVItem->cchTextMax);
+ }
pmLVItem->iImage = wLVItem.iImage;
pmLVItem->lParam = wLVItem.lParam;
pmLVItem->iIndent = wLVItem.iIndent;
wLVItem.iSubItem = pmLVItem->iSubItem;
wLVItem.state = pmLVItem->state;
wLVItem.stateMask = pmLVItem->stateMask;
- pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
- wLVItem.pszText = pw0;
- // TODO: cchTextMax\82Ì\8am\94F
- wLVItem.cchTextMax = pmLVItem->cchTextMax;
+ if(pmLVItem->mask & LVIF_TEXT)
+ {
+ pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
+ wLVItem.pszText = pw0;
+ // TODO: cchTextMaxの確認
+ wLVItem.cchTextMax = pmLVItem->cchTextMax;
+ }
wLVItem.iImage = pmLVItem->iImage;
wLVItem.lParam = pmLVItem->lParam;
wLVItem.iIndent = pmLVItem->iIndent;
wLVItem.iSubItem = pmLVItem->iSubItem;
wLVItem.state = pmLVItem->state;
wLVItem.stateMask = pmLVItem->stateMask;
- pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
- wLVItem.pszText = pw0;
- // TODO: cchTextMax\82Ì\8am\94F
- wLVItem.cchTextMax = pmLVItem->cchTextMax;
+ if(pmLVItem->mask & LVIF_TEXT)
+ {
+ pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
+ wLVItem.pszText = pw0;
+ // TODO: cchTextMaxの確認
+ wLVItem.cchTextMax = pmLVItem->cchTextMax;
+ }
wLVItem.iImage = pmLVItem->iImage;
wLVItem.lParam = pmLVItem->lParam;
wLVItem.iIndent = pmLVItem->iIndent;
case LVM_FINDITEMA:
pmLVFindInfo = (LVFINDINFOA*)lParam;
wLVFindInfo.flags = pmLVFindInfo->flags;
- pw0 = DuplicateMtoW(pmLVFindInfo->psz, -1);
- wLVFindInfo.psz = pw0;
+ if(pmLVFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL))
+ {
+ pw0 = DuplicateMtoW(pmLVFindInfo->psz, -1);
+ wLVFindInfo.psz = pw0;
+ }
wLVFindInfo.lParam = pmLVFindInfo->lParam;
wLVFindInfo.pt = pmLVFindInfo->pt;
wLVFindInfo.vkDirection = pmLVFindInfo->vkDirection;
wLVColumn.fmt = pmLVColumn->fmt;
wLVColumn.cx = pmLVColumn->cx;
Size = pmLVColumn->cchTextMax * 4;
- pw0 = AllocateStringW(Size);
- wLVColumn.pszText = pw0;
- wLVColumn.cchTextMax = Size;
+ if(pmLVColumn->mask & LVCF_TEXT)
+ {
+ pw0 = AllocateStringW(Size);
+ wLVColumn.pszText = pw0;
+ wLVColumn.cchTextMax = Size;
+ }
wLVColumn.iSubItem = pmLVColumn->iSubItem;
wLVColumn.iImage = pmLVColumn->iImage;
wLVColumn.iOrder = pmLVColumn->iOrder;
pmLVColumn->mask = wLVColumn.mask;
pmLVColumn->fmt = wLVColumn.fmt;
pmLVColumn->cx = wLVColumn.cx;
- WtoM(pmLVColumn->pszText, pmLVColumn->cchTextMax, wLVColumn.pszText, -1);
- TerminateStringM(pmLVColumn->pszText, pmLVColumn->cchTextMax);
+ if(pmLVColumn->mask & LVCF_TEXT)
+ {
+ WtoM(pmLVColumn->pszText, pmLVColumn->cchTextMax, wLVColumn.pszText, -1);
+ TerminateStringM(pmLVColumn->pszText, pmLVColumn->cchTextMax);
+ }
pmLVColumn->iSubItem = wLVColumn.iSubItem;
pmLVColumn->iImage = wLVColumn.iImage;
pmLVColumn->iOrder = wLVColumn.iOrder;
wLVColumn.mask = pmLVColumn->mask;
wLVColumn.fmt = pmLVColumn->fmt;
wLVColumn.cx = pmLVColumn->cx;
- pw0 = DuplicateMtoW(pmLVColumn->pszText, -1);
- wLVColumn.pszText = pw0;
- // TODO: cchTextMax\82Ì\8am\94F
- wLVColumn.cchTextMax = pmLVColumn->cchTextMax;
+ if(pmLVColumn->mask & LVCF_TEXT)
+ {
+ pw0 = DuplicateMtoW(pmLVColumn->pszText, -1);
+ wLVColumn.pszText = pw0;
+ // TODO: cchTextMaxの確認
+ wLVColumn.cchTextMax = pmLVColumn->cchTextMax;
+ }
wLVColumn.iSubItem = pmLVColumn->iSubItem;
wLVColumn.iImage = pmLVColumn->iImage;
wLVColumn.iOrder = pmLVColumn->iOrder;
{
LRESULT r = 0;
START_ROUTINE
- // WNDPROC\82ªShift_JIS\97p\82Å\82 \82é\82½\82ß
+ // WNDPROCがShift_JIS用であるため
if(IsWindowUnicode(hWnd))
r = DefDlgProcW(hWnd, Msg, wParam, lParam);
else
wchar_t* pw0 = NULL;
START_ROUTINE
if(iFile == (UINT)-1)
- r = DragQueryFileW(hDrop, iFile, lpszFile, cch);
+ r = DragQueryFileW(hDrop, iFile, (LPWSTR)lpszFile, cch);
else
{
pw0 = AllocateStringW(cch * 4);
return r;
}
+LPSTR GetCommandLineM()
+{
+ LPSTR r = 0;
+ static char* pm0 = NULL;
+START_ROUTINE
+ if(!pm0)
+ pm0 = DuplicateWtoM(GetCommandLineW(), -1);
+ r = pm0;
+END_ROUTINE
+ return r;
+}
+
DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer)
{
DWORD r = 0;
wchar_t* pw0 = NULL;
START_ROUTINE
+ // TODO: バッファが不十分な場合に必要なサイズを返す
pw0 = AllocateStringW(nBufferLength * 4);
GetCurrentDirectoryW(nBufferLength * 4, pw0);
WtoM(lpBuffer, nBufferLength, pw0, -1);
return r;
}
-BOOL SetDllDirectoryM(LPCSTR lpPathName)
-{
- BOOL r = FALSE;
- wchar_t* pw0 = NULL;
-START_ROUTINE
- pw0 = DuplicateMtoW(lpPathName, -1);
- r = SetDllDirectoryW(pw0);
-END_ROUTINE
- FreeDuplicatedString(pw0);
- return r;
-}
-
DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer)
{
DWORD r = 0;
case REG_SZ:
case REG_EXPAND_SZ:
case REG_MULTI_SZ:
- if(lpData && lpcbData)
+ if(lpcbData)
{
pw1 = AllocateStringW(*lpcbData / sizeof(char) * 4);
wcbData = *lpcbData / sizeof(char) * 4;
r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, (LPBYTE)pw1, &wcbData);
- *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t));
+ if(lpData)
+ *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t));
+ else
+ *lpcbData = sizeof(char) * WtoM(NULL, 0, pw1, wcbData / sizeof(wchar_t));
}
break;
default:
a0.hIcon = v0->hIcon;
a0.pszCaption = DuplicateMtoW(v0->pszCaption, -1);
a0.nPages = v0->nPages;
- a0.pStartPage = DuplicateMtoW(v0->pStartPage, -1);
- if(v0->ppsp && (pwPage = (PROPSHEETPAGEW*)malloc(sizeof(PROPSHEETPAGEW) * v0->nPages)))
+ if(v0->dwFlags & PSH_USEPSTARTPAGE)
+ a0.pStartPage = DuplicateMtoW(v0->pStartPage, -1);
+ else
+ a0.nStartPage = v0->nStartPage;
+ if(v0->dwFlags & PSH_PROPSHEETPAGE)
{
- for(i = 0; i < v0->nPages; i++)
+ if(v0->ppsp && (pwPage = (PROPSHEETPAGEW*)malloc(sizeof(PROPSHEETPAGEW) * v0->nPages)))
{
- pwPage[i].dwSize = sizeof(PROPSHEETPAGEW);
- pwPage[i].dwFlags = v0->ppsp[i].dwFlags;
- pwPage[i].hInstance = v0->ppsp[i].hInstance;
- pwPage[i].pszTemplate = DuplicateMtoW(v0->ppsp[i].pszTemplate, -1);
- if(v0->ppsp[i].dwFlags & PSP_USEICONID)
- pwPage[i].pszIcon = DuplicateMtoW(v0->ppsp[i].pszIcon, -1);
- else
- pwPage[i].hIcon = v0->ppsp[i].hIcon;
- if(v0->ppsp[i].dwFlags & PSP_USETITLE)
- pwPage[i].pszTitle = DuplicateMtoW(v0->ppsp[i].pszTitle, -1);
- pwPage[i].pfnDlgProc = v0->ppsp[i].pfnDlgProc;
- pwPage[i].lParam = v0->ppsp[i].lParam;
- // TODO: pfnCallback
- pwPage[i].pfnCallback = v0->ppsp[i].pfnCallback;
- pwPage[i].pcRefParent = v0->ppsp[i].pcRefParent;
-// pwPage[i].pszHeaderTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderTitle, -1);
-// pwPage[i].pszHeaderSubTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderSubTitle, -1);
- pwPage[i].hActCtx = v0->ppsp[i].hActCtx;
-// pwPage[i].pszbmHeader = DuplicateMtoW(v0->ppsp[i].pszbmHeader, -1);
+ for(i = 0; i < v0->nPages; i++)
+ {
+ pwPage[i].dwSize = sizeof(PROPSHEETPAGEW);
+ pwPage[i].dwFlags = v0->ppsp[i].dwFlags;
+ pwPage[i].hInstance = v0->ppsp[i].hInstance;
+ if(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT)
+ pwPage[i].pResource = v0->ppsp[i].pResource;
+ else
+ pwPage[i].pszTemplate = DuplicateMtoW(v0->ppsp[i].pszTemplate, -1);
+ if(v0->ppsp[i].dwFlags & PSP_USEICONID)
+ pwPage[i].pszIcon = DuplicateMtoW(v0->ppsp[i].pszIcon, -1);
+ else
+ pwPage[i].hIcon = v0->ppsp[i].hIcon;
+ if(v0->ppsp[i].dwFlags & PSP_USETITLE)
+ pwPage[i].pszTitle = DuplicateMtoW(v0->ppsp[i].pszTitle, -1);
+ pwPage[i].pfnDlgProc = v0->ppsp[i].pfnDlgProc;
+ pwPage[i].lParam = v0->ppsp[i].lParam;
+ // TODO: pfnCallback
+ pwPage[i].pfnCallback = (LPFNPSPCALLBACKW)v0->ppsp[i].pfnCallback;
+ pwPage[i].pcRefParent = v0->ppsp[i].pcRefParent;
+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
+ pwPage[i].pszHeaderTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderTitle, -1);
+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
+ pwPage[i].pszHeaderSubTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderSubTitle, -1);
+ }
}
+ else
+ pwPage = NULL;
+ a0.ppsp = pwPage;
}
else
- pwPage = NULL;
- a0.ppsp = pwPage;
+ a0.phpage = v0->phpage;
a0.pfnCallback = v0->pfnCallback;
+ if(v0->dwFlags & PSH_USEHBMWATERMARK)
+ a0.hbmWatermark = v0->hbmWatermark;
+ else
+ a0.pszbmWatermark = DuplicateMtoW(v0->pszbmWatermark, -1);
r = PropertySheetW(&a0);
if(a0.dwFlags & PSH_USEICONID)
- FreeDuplicatedString(a0.pszIcon);
- FreeDuplicatedString(a0.pszCaption);
- FreeDuplicatedString(a0.pStartPage);
- if(pwPage)
+ FreeDuplicatedString((void*)a0.pszIcon);
+ FreeDuplicatedString((void*)a0.pszCaption);
+ if(v0->dwFlags & PSH_USEPSTARTPAGE)
+ FreeDuplicatedString((void*)a0.pStartPage);
+ if(v0->dwFlags & PSH_PROPSHEETPAGE)
{
- for(i = 0; i < v0->nPages; i++)
+ if(pwPage)
{
- FreeDuplicatedString(pwPage[i].pszTemplate);
- if(pwPage[i].dwFlags & PSP_USEICONID)
- FreeDuplicatedString(pwPage[i].pszIcon);
- if(pwPage[i].dwFlags & PSP_USETITLE)
- FreeDuplicatedString(pwPage[i].pszTitle);
-// FreeDuplicatedString(pwPage[i].pszHeaderTitle);
-// FreeDuplicatedString(pwPage[i].pszHeaderSubTitle);
-// FreeDuplicatedString(pwPage[i].pszbmHeader);
+ for(i = 0; i < v0->nPages; i++)
+ {
+ if(!(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT))
+ FreeDuplicatedString((void*)pwPage[i].pszTemplate);
+ if(v0->ppsp[i].dwFlags & PSP_USEICONID)
+ FreeDuplicatedString((void*)pwPage[i].pszIcon);
+ if(v0->ppsp[i].dwFlags & PSP_USETITLE)
+ FreeDuplicatedString((void*)pwPage[i].pszTitle);
+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
+ FreeDuplicatedString((void*)pwPage[i].pszHeaderTitle);
+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
+ FreeDuplicatedString((void*)pwPage[i].pszHeaderSubTitle);
+ }
+ free(pwPage);
}
- free(pwPage);
}
+ if(!(v0->dwFlags & PSH_USEHBMWATERMARK))
+ FreeDuplicatedString((void*)a0.pszbmWatermark);
END_ROUTINE
return r;
}
pw1 = DuplicateMtoW(lpDirectory, -1);
pw2 = AllocateStringW(MAX_PATH * 4);
r = FindExecutableW(pw0, pw1, pw2);
- // \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
+ // バッファ長不明のためオーバーランの可能性あり
WtoM(lpResult, MAX_PATH, pw2, -1);
TerminateStringM(lpResult, MAX_PATH);
END_ROUTINE
wbi.lParam = lpbi->lParam;
wbi.iImage = lpbi->iImage;
r = SHBrowseForFolderW(&wbi);
- // \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
+ // バッファ長不明のためオーバーランの可能性あり
WtoM(lpbi->pszDisplayName, MAX_PATH, wbi.pszDisplayName, -1);
lpbi->iImage = wbi.iImage;
END_ROUTINE
START_ROUTINE
pw0 = AllocateStringW(MAX_PATH * 4);
r = SHGetPathFromIDListW(pidl, pw0);
- // \83o\83b\83t\83@\92·\95s\96¾\82Ì\82½\82ß\83I\81[\83o\81[\83\89\83\93\82Ì\89Â\94\\90«\82 \82è
+ // バッファ長不明のためオーバーランの可能性あり
WtoM(pszPath, MAX_PATH, pw0, -1);
TerminateStringM(pszPath, MAX_PATH);
END_ROUTINE
wFileOp.fFlags = lpFileOp->fFlags;
wFileOp.fAnyOperationsAborted = lpFileOp->fAnyOperationsAborted;
wFileOp.hNameMappings = lpFileOp->hNameMappings;
- pw2 = DuplicateMtoW(lpFileOp->lpszProgressTitle, -1);
+ if(lpFileOp->fFlags & FOF_SIMPLEPROGRESS)
+ pw2 = DuplicateMtoW(lpFileOp->lpszProgressTitle, -1);
r = SHFileOperationW(&wFileOp);
lpFileOp->fAnyOperationsAborted = wFileOp.fAnyOperationsAborted;
END_ROUTINE
wmii.hbmpChecked = lpmii->hbmpChecked;
wmii.hbmpUnchecked = lpmii->hbmpUnchecked;
wmii.dwItemData = lpmii->dwItemData;
- pw0 = DuplicateMtoWBuffer(lpmii->dwTypeData, -1, lpmii->cch * 4);
- wmii.dwTypeData = pw0;
- wmii.cch = lpmii->cch * 4;
+ if(lpmii->fMask & MIIM_TYPE)
+ {
+ pw0 = DuplicateMtoWBuffer(lpmii->dwTypeData, -1, lpmii->cch * 4);
+ wmii.dwTypeData = pw0;
+ wmii.cch = lpmii->cch * 4;
+ }
+ wmii.hbmpItem = lpmii->hbmpItem;
r = GetMenuItemInfoW(hmenu, item, fByPosition, &wmii);
lpmii->fType = wmii.fType;
lpmii->fState = wmii.fState;
v0->nFontType = a0.nFontType;
if(pwlf)
free(pwlf);
- FreeDuplicatedString(a0.lpTemplateName);
+ FreeDuplicatedString((void*)a0.lpTemplateName);
FreeDuplicatedString(a0.lpszStyle);
END_ROUTINE
FreeDuplicatedString(pw0);
{
size_t r = 0;
wchar_t* pw0 = NULL;
- wchar_t* wr;
START_ROUTINE
pw0 = DuplicateMtoW(_Str, -1);
r = wcslen(pw0);
wchar_t* wr;
START_ROUTINE
pw0 = DuplicateMtoW(_Str, -1);
- // TODO: \94ñASCII\95¶\8e\9a\82Ì\91Î\89\9e
+ // TODO: 非ASCII文字の対応
wr = wcschr(pw0, _Ch);
if(wr)
{
*wr = L'\0';
- r = _Str + WtoM(NULL, 0, pw0, -1) - 1;
+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
}
END_ROUTINE
FreeDuplicatedString(pw0);
wchar_t* wr;
START_ROUTINE
pw0 = DuplicateMtoW(_Str, -1);
- // TODO: \94ñASCII\95¶\8e\9a\82Ì\91Î\89\9e
+ // TODO: 非ASCII文字の対応
wr = wcsrchr(pw0, _Ch);
if(wr)
{
*wr = L'\0';
- r = _Str + WtoM(NULL, 0, pw0, -1) - 1;
+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
}
END_ROUTINE
FreeDuplicatedString(pw0);
if(wr)
{
*wr = L'\0';
- r = _Str + WtoM(NULL, 0, pw0, -1) - 1;
+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
}
END_ROUTINE
FreeDuplicatedString(pw0);
if(wr)
{
*wr = L'\0';
- r = _Str + WtoM(NULL, 0, pw0, -1) - 1;
+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
}
END_ROUTINE
FreeDuplicatedString(pw0);
return r;
}
+FILE * fopenM(const char * _Filename, const char * _Mode)
+{
+ FILE* r = NULL;
+ wchar_t* pw0 = NULL;
+ wchar_t* pw1 = NULL;
+START_ROUTINE
+ pw0 = DuplicateMtoW(_Filename, -1);
+ pw1 = DuplicateMtoW(_Mode, -1);
+ r = _wfopen(pw0, pw1);
+END_ROUTINE
+ FreeDuplicatedString(pw0);
+ FreeDuplicatedString(pw1);
+ return r;
+}
+