do not use MAX_PATH anymore in main.c

This commit is contained in:
Thomas Bernard 2019-05-23 13:14:06 +02:00
parent fdb317ebdf
commit d287d55710
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C

View File

@ -1391,31 +1391,84 @@ int main(int argc,char * argv[])
#endif #endif
{ {
#if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2) #if defined(WIN32) && !defined(USE_SDL) && !defined(USE_SDL2)
WCHAR ModuleFileName[MAX_PATH]; WCHAR * ModuleFileName = NULL;
WCHAR TmpArg[MAX_PATH]; DWORD ModuleFileNameSize = 64;
WCHAR ShortFileName[MAX_PATH]; DWORD Ret;
int i, j, k; WCHAR * TmpArg = NULL;
DWORD TmpArgSize = 0;
WCHAR * ShortFileName;
DWORD ShortFileNameSize;
DWORD i, j, k;
int inquote = 0; int inquote = 0;
int argc = 0; int argc = 0;
char arg_buffer[4096]; char arg_buffer[4096];
char * argv[64] = {NULL}; char * argv[64] = {NULL};
Init_Win32(hInstance, hPrevInstance); Init_Win32(hInstance, hPrevInstance);
if (GetModuleFileNameW(NULL, ModuleFileName, MAX_PATH) == 0)
// GetModuleFileNameW() returns the size argument when the
// path is truncated.
do
{ {
MessageBoxA(NULL, "Error initializing program", NULL, MB_OK | MB_ICONERROR); ModuleFileNameSize *= 2;
free(ModuleFileName);
ModuleFileName = (WCHAR *)malloc(sizeof(WCHAR) * ModuleFileNameSize);
if (ModuleFileName == NULL)
{
MessageBoxA(NULL, "Error initializing program (alloc)", NULL, MB_OK | MB_ICONERROR);
return 1; return 1;
} }
GetShortPathNameW(ModuleFileName, ShortFileName, MAX_PATH); Ret = GetModuleFileNameW(NULL, ModuleFileName, ModuleFileNameSize);
if (Ret == 0)
{
MessageBoxA(NULL, "Error initializing program\nGetModuleFileName()", NULL, MB_OK | MB_ICONERROR);
return 1;
}
}
while (Ret >= ModuleFileNameSize);
ShortFileNameSize = GetShortPathNameW(ModuleFileName, NULL, 0);
if (ShortFileNameSize == 0)
{
MessageBoxA(NULL, "Error initializing program\nGetShortPathName()", NULL, MB_OK | MB_ICONERROR);
return 1;
}
ShortFileName = (WCHAR *)malloc(sizeof(WCHAR) * ShortFileNameSize);
if (ShortFileName == NULL)
{
MessageBoxA(NULL, "Error initializing program (alloc)", NULL, MB_OK | MB_ICONERROR);
return 1;
}
if (GetShortPathNameW(ModuleFileName, ShortFileName, ShortFileNameSize) == 0)
{
MessageBoxA(NULL, "Error initializing program\nGetShortPathName()", NULL, MB_OK | MB_ICONERROR);
return 1;
}
free(ModuleFileName);
// set argv[0]
argv[argc++] = arg_buffer; argv[argc++] = arg_buffer;
for (i = 0; i < (int)sizeof(arg_buffer); ) for (i = 0; i < (int)sizeof(arg_buffer); )
{ {
arg_buffer[i] = (char)ShortFileName[i]; arg_buffer[i] = (char)ShortFileName[i];
if (arg_buffer[i++] == 0) break; if (arg_buffer[i++] == 0) break;
} }
free(ShortFileName);
// set remaining argv[]
k = 0; k = 0;
for (j = 0; pCmdLine[j] != 0 && k < MAX_PATH - 1; j++) for (j = 0; pCmdLine[j] != 0; j++)
{ {
if (k >= TmpArgSize)
{
TmpArgSize = (TmpArgSize == 0) ? 16 : 2 * TmpArgSize;
TmpArg = (WCHAR *)realloc(TmpArg, TmpArgSize);
if (TmpArg == NULL)
{
MessageBoxA(NULL, "Error initializing program (realloc)", NULL, MB_OK | MB_ICONERROR);
return 1;
}
}
if (inquote) if (inquote)
{ {
if (pCmdLine[j] == '"') if (pCmdLine[j] == '"')
@ -1435,10 +1488,14 @@ int main(int argc,char * argv[])
{ // next argument { // next argument
TmpArg[k++] = '\0'; TmpArg[k++] = '\0';
argv[argc++] = arg_buffer + i; argv[argc++] = arg_buffer + i;
if (GetShortPathNameW(TmpArg, ShortFileName, MAX_PATH) > 0) ShortFileNameSize = GetShortPathNameW(TmpArg, NULL, 0);
if (ShortFileNameSize > 0)
{ {
ShortFileName = (WCHAR *)malloc(sizeof(WCHAR) * ShortFileNameSize);
Ret = GetShortPathNameW(TmpArg, ShortFileName, ShortFileNameSize);
for (k = 0; ShortFileName[k] != 0; k++) for (k = 0; ShortFileName[k] != 0; k++)
arg_buffer[i++] = ShortFileName[k]; arg_buffer[i++] = ShortFileName[k];
free(ShortFileName);
} }
else else
{ {
@ -1452,14 +1509,19 @@ int main(int argc,char * argv[])
} }
TmpArg[k++] = pCmdLine[j]; TmpArg[k++] = pCmdLine[j];
} }
TmpArg[k] = '\0'; // process the last argument
if (k > 0) if (k > 0)
{ {
TmpArg[k] = '\0';
argv[argc++] = arg_buffer + i; argv[argc++] = arg_buffer + i;
if (GetShortPathNameW(TmpArg, ShortFileName, MAX_PATH) > 0) ShortFileNameSize = GetShortPathNameW(TmpArg, NULL, 0);
if (ShortFileNameSize > 0)
{ {
ShortFileName = (WCHAR *)malloc(sizeof(WCHAR) * ShortFileNameSize);
Ret = GetShortPathNameW(TmpArg, ShortFileName, ShortFileNameSize);
for (k = 0; ShortFileName[k] != 0; k++) for (k = 0; ShortFileName[k] != 0; k++)
arg_buffer[i++] = ShortFileName[k]; arg_buffer[i++] = ShortFileName[k];
free(ShortFileName);
} }
else else
{ {
@ -1469,6 +1531,7 @@ int main(int argc,char * argv[])
arg_buffer[i++] = 0; arg_buffer[i++] = 0;
} }
free(TmpArg);
// TODO : nCmdShow indicates if the window must be maximized, etc. // TODO : nCmdShow indicates if the window must be maximized, etc.
#endif #endif
if(!Init_program(argc,argv)) if(!Init_program(argc,argv))