Могу ли я получить путь, содержащий символы, отличные от латинских?

Я звоню 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);

0

Решение

Строки в .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");
0

Другие решения

Вы должны использовать GetModuleFileNameW и сохранить результат в wchar_t строка.

Большинство функций Win32 API имеют вариант «Unicode», который принимает / передает строки UTF-16. Использование версий ANSI крайне не рекомендуется.

0

По вопросам рекламы [email protected]