2011-07-01 37 views
0

我想調用函數CreateProcessAsUser。傳遞常量字符串很好。嘗試使用char * getenv(const char name)來獲取環境變量會導致我遇到問題。C++ LPTSTR問題與getenv調用CreateProcessAsUser

如果我使用以下,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

擺脫轉換爲'(LPTSTR)' - 如果編譯器在沒有轉換的情況下給出了一個錯誤消息,那麼插入一個轉換來關閉編譯器就是**做錯了**。編譯器試圖告訴你一些事情。在這種情況下,您正在編譯一個Unicode應用程序,並且您希望在需要Unicode字符串時傳遞ANSI字符串 - 使用['_tgetenv'](http://msdn.microsoft.com/zh-cn/ library/tehxacec.aspx)而不是'getenv'。 –

+0

你知道'getenv'是否成功了嗎? –

+1

@Adam Rosenfield:[「由於編譯器無法轉換參數,讓我們給它一些幫助,然後在前面粘貼一個轉換,在那裏關閉編譯器,這些編譯器都很笨。」](http:/ /blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx) –

回答

2

第三個參數lpCommandLineLPTSTR,這意味着它必須是可寫內存。在調用CreateProcessAsUser之前,您需要將命令行復制到可寫字符串中。

的文檔getenv狀態:

它是不是安全使用返回指針修改環境變量的值。

因此,您不能將此作爲lpCommandLine參數CreateProcessAsUser

您的第一個電話CreateProcessAsUser似乎也是錯誤的,因爲您還沒有傳遞lpCommandLine的可寫內存。

當然,你最直接的問題是你混合了ANSI和Unicode。如果您的應用程序是Unicode,那麼如果您確實想從同一個來源同時定位ANSI和Unicode,則需要撥打_wgetenv_tgetenv。但在傳遞它之前,請確保將其複製到可寫緩衝區中。

最後,正如亞當所評論的,每次你寫劇組時,很有可能你犯了一個錯誤。

+0

啊,很好的調用,我忘了'* getenv'函數返回只讀但非''constst'指針。至於爲什麼'CreateProcessAsUser'和'CreateProcess'需要可寫命令行,請參見[爲什麼CreateProcess函數修改其輸入命令行?](http://blogs.msdn.com/b/oldnewthing/archive/2009/06/ 01/9673254.aspx)。 –

0

無論您的應用程序設置爲使用哪種字符集,getenv()將始終返回一個char *。請嘗試使用_tgetenv(),因爲它根據需要在char *和wchar_t *之間進行調整。