C++LPTSTR使用getenv调用CreateProcessAsUser时出现问题

C++ LPTSTR problem calling CreateProcessAsUser with getenv

本文关键字:问题 CreateProcessAsUser 使用 getenv 调用 C++LPTSTR      更新时间:2023-10-16

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

谢谢!

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

getenv的文档说明:

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

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

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

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

最后,正如亚当所评论的,每次你写演员阵容时,都有很大的可能性是你犯了错误。

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