Как конвертировать CreateProcess в ShellExecuteEx? - PullRequest
0 голосов
/ 15 сентября 2010

Я использую библиотеку обхода MS для подключения CreateProcess, и она отлично работает на Win7. Затем я хочу заменить отклоненный CreateProcess на ShellExecuteEx, чтобы я мог использовать 'runas' для автоматического запуска программы с привилегиями администратора. К сожалению, тип параметра не совпадает.

Это сигнатура функции:

CreateProcess( 
         LPCWSTR lpszImageName, 
         LPCWSTR lpszCmdLine, 
         LPSECURITY_ATTRIBUTES lpsaProcess, 
         LPSECURITY_ATTRIBUTES lpsaThread, 
         BOOL fInheritHandles, 
         DWORD fdwCreate, 
         LPVOID lpvEnvironment, 
         LPWSTR lpszCurDir, 
         LPSTARTUPINFOW lpsiStartInfo, 
         LPPROCESS_INFORMATION lppiProcInfo 
      ); 

Здесь я вызываю ShellExecuteEx:

SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = 0 ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = lpszImageName; // this is obatined within deboured CreateProcess.
ShExecInfo.lpParameters = ""; 
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo);

Однако, это назначение имеет ошибку: ShExecInfo.lpFile = lpszImageName; VC2005 жалуется, что тип данных не совпадает: "cannot convert from const unsigned char * to const char *".

Но тип данных LPCWSTR для параметра lpszImageName в CreateProcess, а ShExecInfo.lpFile - LPCTSTR.

Если я использую (const unsigned char *) для преобразования lpszImageName, значение lpFile является только первой буквой значения lpszImageName.

Например, если lpszImageName - «C: \ windows \ system32 \ cmd.exe». После присваивания значение lpFile - только «C».

Как я могу конвертировать из LPCWSTR в LPCTSTR? Или как я мог сделать преобразование?

Спасибо !!!

1 Ответ

1 голос
/ 15 сентября 2010

Похоже, вы подключили CreateProcessW () и пытаетесь сопоставить его с ShellExecuteExA ().Вместо этого сопоставьте с ShellExecuteExW () и используйте структуру SHELLEXECUTEINFOW, которая использует широкие (LPCWSTR) строки.

...