如何将CreateProcess转换为ShellExecuteEx?

时间:2010-09-15 03:42:34

标签: windows-7 createprocess shellexecuteex

我使用MS绕道库来挂钩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投诉的数据类型不一样:"cannot convert from const unsigned char * to const char *"

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

如果我使用(const unsigned char *)转换lpszImageName,则lpFile的值只是lpszImageName值的第一个字母。

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

如何从LPCWSTR转换为LPCTSTR?或者我怎么能进行转换呢?

感谢!!!

1 个答案:

答案 0 :(得分:1)

看起来你已经连接了CreateProcessW()并试图将它映射到ShellExecuteExA()。而是映射到ShellExecuteExW()并使用SHELLEXECUTEINFOW结构,该结构使用宽(LPCWSTR)字符串。