我正在尝试调用函数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的用户和系统环境变量。
谢谢!
答案 0 :(得分:2)
第三个参数lpCommandLine
是LPTSTR
,这意味着它必须是可写内存。在调用CreateProcessAsUser
之前,您需要将命令行复制到可写字符串中。
getenv
州的文档:
使用返回的指针修改环境变量的值是不安全的。
因此,您无法将其作为lpCommandLine
的{{1}}参数传递。
您第一次拨打CreateProcessAsUser
似乎也是错误的,因为您还没有为CreateProcessAsUser
传递可写内存。
当然,您最直接的问题是您正在混合使用ANSI和Unicode。如果您的应用是Unicode,那么您需要调用lpCommandLine
或_wgetenv
,如果您确实想要从同一来源同时使用ANSI和Unicode。但请确保在传递之前将其复制到可写缓冲区中。
最后,正如亚当评论的那样,每次你写一个演员,很有可能你犯了错误。
答案 1 :(得分:0)
getenv()将始终返回char *。请尝试使用_tgetenv(),因为它根据需要在char *和wchar_t *之间进行调整。