使用getenv调用CreateProcessAsUser的C ++ LPTSTR问题

时间:2011-07-01 21:55:11

标签: c++ createprocessasuser getenv lptstr

我正在尝试调用函数CreateProcessAsUser。传递常量字符串很好。尝试使用char * getenv(const char name)获取环境变量会导致我出现问题。

如果我使用以下内容,则会运行notepad.exe。

CreateProcessAsUser(hTokenDup, _T("c:\\windows\\notepad.exe"), 
                    _T("c:\\windows\\notepad.exe"), NULL, NULL, FALSE,
                    dwCreationFlag, pEnvironment, NULL, &si, &pi);

但是,如果我使用以下内容,则无法运行。

CreateProcessAsUser(hTokenDup, _T("MyAppName"), 
                    (LPTSTR)getenv("MYENVVAR"), NULL, NULL, FALSE,
                    dwCreationFlag, pEnvironment, NULL, &si, &pi);

我是否正确指定了getenv和(LPTSTR)?

我尝试使用包含c:\\ windows \\ notepad.exe和c:\ windows \ notepad.exe的用户和系统环境变量。

谢谢!

2 个答案:

答案 0 :(得分:2)

第三个参数lpCommandLineLPTSTR,这意味着它必须是可写内存。在调用CreateProcessAsUser之前,您需要将命令行复制到可写字符串中。

getenv州的文档:

  

使用返回的指针修改环境变量的值是不安全的。

因此,您无法将其作为lpCommandLine的{​​{1}}参数传递。

您第一次拨打CreateProcessAsUser似乎也是错误的,因为您还没有为CreateProcessAsUser传递可写内存。

当然,您最直接的问题是您正在混合使用ANSI和Unicode。如果您的应用是Unicode,那么您需要调用lpCommandLine_wgetenv,如果您确实想要从同一来源同时使用ANSI和Unicode。但请确保在传递之前将其复制到可写缓冲区中。

最后,正如亚当评论的那样,每次你写一个演员,很有可能你犯了错误。

答案 1 :(得分:0)

无论您的应用程序设置为使用什么字符集,

getenv()将始终返回char *。请尝试使用_tgetenv(),因为它根据需要在char *和wchar_t *之间进行调整。