Я хочу использовать Win API CreateProcess для которого принимает 2-й параметр как «LPTSTR».
Но у меня есть путь к моему exe в массиве символов. Мой проект VS2013 (статическая библиотека) имеет тип кодировки Unicode.
Код снипперт ниже.
В этой строке
«appPath = (LPTSTR) TestEXEPath;»
из приведенного ниже фрагмента кода, где происходит приведение типов, я вижу, что символы в «appPath» преобразуются в некоторые ненужные символы, тогда как в правой части этого выражения «TestEXEPath» действительно есть допустимые символы.
Однако здесь нет ошибки компиляции. Во время выполнения эти символы повреждаются в «appPath».
Я знаю, что этот тип создает эту проблему. Но как мне решить эту проблему, как мне набрать приведение этого массива char к LPTSTR typr, который необходим для API CreateProcess ().
Или есть ли лучший способ сделать это, чтобы избежать самого массива char.
LPTSTR appPath;
char cwd[_MAX_PATH];
getcwd(cwd, _MAX_PATH);
char TestEXEPath[_MAX_PATH];
strcpy(TestEXEPath, cwd);
strcat(TestEXEPath, "\\pwrtest.exe /sleep /c:1");
appPath = (LPTSTR)TestEXEPath; // The characters in this gets converted to some junk characters.
.......................
......................
CreateProcess(NULL, appPath, NULL, NULL, FALSE, 0, NULL, workingDir, &sI, &pI))
Вы компилируете для Unicode, так LPTSTR
расширяется до wchar_t*
, Но у вас есть данные ANSI, char*
, В этом случае проще всего позвонить CreateProcessA
и передать данные ANSI.
BOOL retval = CreateProcessA(..., TestExePath, ...));
Если вы хотите избежать использования функций ANSI, вы можете придерживаться wchar_t
массивы.
whar_t exepath[MAX_PATH + 100]; // enough room for cwd and the rest of command line
GetCurrentDirectory(MAX_PATH, exepath);
wcscat(exepath, L"\\pwrtest.exe /sleep /c:1");
BOOL retval = CreateProcess(..., exepath, ...);
Обратите внимание, что я перешел с getcwd
в GetCurrentDirectory
чтобы получить широкую версию рабочего каталога.
Обратите внимание, что ваш код должен проверять наличие ошибок. Я забыл сделать это здесь из-за лени. Но в вашем реальном коде вы не должны быть такими ленивыми, как я.
Тот факт, что вы должны были разыграть, должен был вызвать для вас предупреждающие сигналы. Ну, судя по вопросу, это, вероятно, сделал. Когда вы пишете:
appPath = (LPTSTR)TestEXEPath;
Это просто говорит компилятору лечить TestEXEPath
как LPTSTR
действительно ли это или нет. И тот факт, что программа не будет компилироваться без приведения, говорит вам, что TestEXEPath
не является LPTSTR
, Приведение не меняет эту реальность, оно просто отключает компилятор. Всегда плохой ход.
При использовании Unicode LPTSTR указывает на массив wchar_t
а не массив char
,
Вот некоторые дополнительные объяснения.
Попробуйте с:
TCHAR TestExePath[_MAX_PATH];
И использовать wcscat()
а также wcscpy()
и другие широкие функции обработки C-строки в <cwchar>
,
Также взгляните на очень удобные классы преобразования ATL здесь: http://msdn.microsoft.com/en-us/library/87zae4a3.aspx
LPTSTR str = CA2T(TestEXEPath);
Или даже проще просто
CreateProcess(NULL, CA2T(TestEXEPath), NULL, NULL, FALSE, 0, NULL, workingDir, &sI, &pI))
Нет разрушения не требуется.