Windows 7 如何将CreateProcess转换为ShellExecuteEx?

Windows 7 如何将CreateProcess转换为ShellExecuteEx?,windows-7,createprocess,shellexecuteex,Windows 7,Createprocess,Shellexecuteex,我使用MS detour库钩住CreateProcess,它在Win7上运行良好。然后我想用ShellExecuteEx替换迂回的CreateProcess,这样我就可以使用“runas”以管理员权限静默运行程序。不幸的是,参数类型不同 这是函数签名: CreateProcess( LPCWSTR lpszImageName, LPCWSTR lpszCmdLine, LPSECURITY_ATTRIBUTES lpsaProcess,

我使用MS detour库钩住CreateProcess,它在Win7上运行良好。然后我想用ShellExecuteEx替换迂回的CreateProcess,这样我就可以使用“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表示数据类型不同:
“无法从常量无符号字符*转换为常量字符*”

但是CreateProcess中参数lpszImageName的数据类型是
LPCWSTR
,ShExecInfo.lpFile是
LPCTSTR

如果使用(const unsigned char*)转换lpszImageName,则lpFile的值仅为lpszImageName值的第一个字母

例如,如果lpszImageName为“C:\windows\system32\cmd.exe”。赋值后,lpFile值仅为“C”

如何将LPCWSTR转换为LPCTSTR?或者我怎么做转换


谢谢

看起来您已经钩住了CreateProcessW()并试图将其映射到ShellExecuteExA()。相反,请映射到ShellExecuteExW()并使用使用使用宽(LPCWSTR)字符串的ShellExecuteInfo结构。

您好,NuSkooler,非常感谢您宝贵的帮助!我确实忘了映射到ShellExecuteXw。