0

我使用 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 投诉数据类型不一样:"cannot convert from const unsigned char * to const char *"

但是数据类型是LPCWSTRCreateProcess 中的参数 lpszImageName 和 ShExecInfo.lpFile 是LPCTSTR.

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

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

如何从 LPCWSTR 转换为 LPCTSTR?或者我该如何进行转换?

谢谢!!!

4

1 回答 1

1

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

于 2010-09-15T03:56:56.700 回答