0

我正在尝试调用函数 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 的用户和系统环境变量。

谢谢!

4

2 回答 2

2

第三个参数,lpCommandLine表示LPTSTR它必须是可写内存。您需要在调用之前将命令行复制到可写字符串中CreateProcessAsUser

状态的文档getenv

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

因此,您不能将其作为 的lpCommandLine参数传递CreateProcessAsUser

您的第一次调用CreateProcessAsUser似乎也是错误的,因为您也没有将可写内存传递给lpCommandLine.

当然,您最直接的问题很可能是您正在混合使用 ANSI 和 Unicode。如果您的应用程序是 Unicode,那么您需要调用_wgetenv,或者_tgetenv如果您确实希望从同一源同时定位 ANSI 和 Unicode。但请确保在传递之前将其复制到可写缓冲区中。

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

于 2011-07-01T22:07:46.420 回答
0

无论您的应用程序设置为使用什么字符集,getenv() 都将始终返回一个 char*。尝试改用 _tgetenv(),因为它会根据需要在 char* 和 wchar_t* 之间进行调整。

于 2011-07-01T22:01:10.197 回答