Мне нужно создать переменную для использования в 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, но с тех пор мало занимался кодированием.
Вы должны сделать 2 вещи:
const char*
в const TCHAR*
, где TCHAR
может быть либо char
или же wchar_t
в зависимости от того, включен ли Unicode для вашего проекта.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
,
При компиляции для Unicode, TCHAR
API-интерфейсы сопоставляются с 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, ...);
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