OSDN Git Service

Fix bugs of UTF-8 to UTF-16 API bridge.
[ffftp/ffftp.git] / mbswrapper.c
index ef019e4..585a26b 100644 (file)
@@ -355,6 +355,18 @@ void FreeDuplicatedString(void* p)
 #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;
+}
+
 HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
 {
        HANDLE r = INVALID_HANDLE_VALUE;
@@ -549,7 +561,7 @@ START_ROUTINE
                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;
@@ -1007,12 +1019,15 @@ START_ROUTINE
                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:
@@ -1827,3 +1842,18 @@ END_ROUTINE
        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;
+}
+