0

関数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を含むユーザー環境変数とシステム環境変数を使用してみました。

ありがとう!

4

2 に答える 2

2

3番目のパラメータは、lpCommandLine書き込みLPTSTR可能なメモリでなければならないことを意味します。を呼び出す前に、コマンドラインを書き込み可能な文字列にコピーする必要がありますCreateProcessAsUser

getenv州のドキュメント:

返されたポインタを使用して環境変数の値を変更することは安全ではありません。

lpCommandLineしたがって、これをのパラメータとして渡すことはできませんCreateProcessAsUser

の書き込み可能なメモリも渡していないため、への最初の呼び出しCreateProcessAsUserも間違っているように見えますlpCommandLine

もちろん、当面の問題は、ANSIとUnicodeを混合していることである可能性が最も高いです。アプリがUnicodeの場合は、を呼び出す必要があります_wgetenv。または_tgetenv、実際に同じソースからANSIとUnicodeの両方をターゲットにしたい場合。ただし、渡す前に必ず書き込み可能なバッファにコピーしてください。

最後に、アダムがコメントしたように、キャストを書くたびに、間違いを犯している可能性が高いです。

于 2011-07-01T22:07:46.420 に答える
0

getenv()は、アプリケーションが使用するように設定されている文字セットに関係なく、常にchar*を返します。代わりに_tgetenv()を使用してみてください。必要に応じて、char*とwchar_t*の間で調整されます。

于 2011-07-01T22:01:10.197 に答える