我使用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?或者我怎么能进行转换呢?
感谢!!!
答案 0 :(得分:1)
看起来你已经连接了CreateProcessW()并试图将它映射到ShellExecuteExA()。而是映射到ShellExecuteExW()并使用SHELLEXECUTEINFOW结构,该结构使用宽(LPCWSTR)字符串。