我正在尝试调用函数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.的用户和系统环境变量
谢谢!
第三个参数lpCommandLine
是LPTSTR
,这意味着它必须是可写内存。在调用CreateProcessAsUser
之前,需要将命令行复制到可写字符串中。
getenv
的文档说明:
使用返回的指针修改环境变量的值是不安全的。
因此,不能将其作为CreateProcessAsUser
的lpCommandLine
参数传递。
您对CreateProcessAsUser
的第一次调用似乎也是错误的,因为您也没有为lpCommandLine
传递可写内存。
当然,最直接的问题很可能是您混合了ANSI和Unicode。如果你的应用程序是Unicode,那么你需要调用_wgetenv
,或者如果你真的想从同一个源同时针对ANSI和Unicode,则需要调用_tgetenv
。但在传递之前,请确保将其复制到可写缓冲区中
最后,正如亚当所评论的,每次你写演员阵容时,都有很大的可能性是你犯了错误。
getenv((将始终返回一个char*,无论您的应用程序设置为使用什么字符集。请尝试使用_tgetenv((,因为它会根据需要在char*和wchar_t*之间进行调整。