Я звоню GetModuleFileName
Функция, чтобы получить полный путь к указанному модулю, чтобы вызвать другой .exe в том же файле, через Process::Start
метод.
Однако .exe не может быть вызван, когда путь содержит символы, отличные от латинских (в моем случае это греческие символы).
Есть ли способ, как я могу это исправить?
Код:
TCHAR path[1000];
GetModuleFileName(NULL, path, 1000) ; // Retrieves the fully qualified path for the file that
// contains the specified module.
PathRemoveFileSpec(path); // Removes the trailing file name and backslash from a path (TCHAR).
CHAR mypath[1000];
// Convert TCHAR to CHAR.
wcstombs(mypath, path, wcslen(path) + 1);
// Formatting the string: constructing a string by substituting computed values at various
// places in a constant string.
CHAR mypath2[1000];
sprintf_s(mypath2, "%s\\Client_JoypadCodesApplication.exe", mypath);
String^ result;
result = marshal_as<String^>(mypath2);
Process::Start(result);
Строки в .NET кодируются в UTF-16. Тот факт, что вы звоните wcstombs()
означает, что ваше приложение скомпилировано для Unicode и TCHAR
карты для WCHAR
Это то, что Windows использует для UTF-16. Так что звонить не нужно wcstombs()
совсем. Извлеките и отформатируйте путь как UTF-16, затем выполните маршалинг как UTF-16. Прекратить использование TCHAR
в целом (если вам не нужно компилировать для Windows 9x / ME):
WCHAR path[1000];
GetModuleFileNameW(NULL, path, 1000);
PathRemoveFileSpecW(path);
WCHAR mypath[1000];
swprintf_s(mypath, 1000, L"%s\\Client_JoypadCodesApplication.exe", path);
String^ result;
result = marshal_as<String^>(mypath);
Process::Start(result);
Лучшим вариантом было бы вместо этого использовать собственное решение .NET (не проверено):
String^ path = Path::DirectoryName(Application->StartupPath); // uses GetModuleFileName() internally
// or:
//String^ path = Path::DirectoryName(Process::GetCurrentProcess()->MainModule->FileName);
Process::Start(path + L"\\Client_JoypadCodesApplication.exe");
Вы должны использовать GetModuleFileNameW
и сохранить результат в wchar_t
строка.
Большинство функций Win32 API имеют вариант «Unicode», который принимает / передает строки UTF-16. Использование версий ANSI крайне не рекомендуется.