Как преобразовать строку в LPTSTR

Мне нужно создать переменную для использования в CreateProcess:

CreateProcess(z7Cmdline, z7Arg, NULL, NULL, FALSE, NULL, NULL, NULL, &startInfo, &processInfo);

Переменная z7Arg представляет собой список аргументов для 7-zip, который содержит имя файла на основе текущей даты, то есть: 2017-12-13.zip.

string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";

Я хочу скопировать buArg в z7Arg как LPTSTR для использования в подпрограмме CreateProcess

Как мне это сделать?

Я новичок в кодировании на C ++, 30 лет назад я программировал в IBM Fortran & Язык ассемблера для Grumman Aerospace, но с тех пор мало занимался кодированием.

4

Решение

Вы должны сделать 2 вещи:

  1. Перерабатывать const char* в const TCHAR*, где TCHAR может быть либо char или же wchar_t в зависимости от того, включен ли Unicode для вашего проекта.
  2. Удалить const так как CreateProcess требует TCHAR*не const TCHAR*, Вы не можете просто использовать const_castвам нужен буфер для записи, который вы передадите CreateProcess,

Для этого вы можете использовать удобные макросы преобразования строк из ATL или MFC. Используйте его следующим образом:

CA2T param(buArg.c_str());
CreateProcess(..., param, ...);

или просто

CreateProcess(..., CA2T(buArg.c_str()), ...);

Подробнее о макросах преобразования строк Вот.

Если у вас нет доступа к ATL или MFC в вашем проекте, и у вас включен Unicode, вам нужно будет вручную конвертировать char* в wchar_t* с помощью MultibyteToWideChar,

7

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

При компиляции для Unicode, TCHARAPI-интерфейсы сопоставляются с wchar_tна основе функций, и при компиляции для ANSI / MCBS они отображаются на charна основе функций вместо.

Итак, в вашем случае, TCHAR-основан CreateProcess() макрос отображается либо CreateProcessA() принятие char* строки или CreateProcessW() принятие wchar_t* строки.

std::string работает с char только и std::wstring работает с wchar_t только.

Итак, самое простое решение вашей проблемы — просто позвонить CreateProcessA() напрямую, например:

std::string z7Cmdline = ...;
std::string z7Arg = ...;
STARTUPINFOA si = {};
...
CreateProcessA(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...);

Если вы хотите позвонить CreateProcessW()использовать std::wstring вместо:

std::wstring z7Cmdline = ;
std::wstring z7Arg = ...;
STARTUPINFOW si = {};
...
CreateProcessW(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...);

В этом последнем случае, если ваш вклад должен быть std:string, то вы должны использовать преобразование во время выполнения, через MultiByteToWideChar(), std::wstring_convert, так далее.

Или вы можете использовать std::basic_string<TCHAR> вместо:

std::basic_string<TCHAR> z7Cmdline = ;
std::basic_string<TCHAR> z7Arg = ...;
STARTUPINFO si = {};
...
CreateProcess(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...);
2

string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";
LPTSTR lpt = new TCHAR[31];
lpt = (LPTSTR) buArg.c_str();

протестировано MinGW 6.3.0

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