【问题标题】:C++ LPTSTR problem calling CreateProcessAsUser with getenv使用 getenv 调用 CreateProcessAsUser 的 C++ LPTSTR 问题
【发布时间】:2011-07-01 21:55:10
【问题描述】:

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

谢谢!

【问题讨论】:

标签: c++ createprocessasuser getenv lptstr


【解决方案1】:

第三个参数lpCommandLineLPTSTR,表示它必须是可写内存。调用CreateProcessAsUser前需要将命令行复制成可写字符串。

getenv 的文档指出:

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

因此,您不能将其作为CreateProcessAsUserlpCommandLine 参数传递。

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

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多