2011-07-01 3 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/en-us/)ライブラリ/ tehxacec.aspx)を使用してください。 –

+0

'getenv'が成功したかどうか知っていますか? –

+1

@Adam Rosenfield:["コンパイラがパラメータを変換できなかったので、助けて前にキャストを貼り付けるとコンパイラがシャットダウンしました。 /blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx) –

答えて

2

第3のパラメータlpCommandLineは、LPTSTRです。つまり、書き込み可能なメモリでなければなりません。 CreateProcessAsUserを呼び出す前に、コマンドラインを書き込み可能な文字列にコピーする必要があります。

getenv状態のドキュメント:

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

パラメータをCreateProcessAsUserとして渡すことはできません。

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

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

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

+0

ああ、いいです、私は、 '* getenv'関数が読み取り専用ではなく、'コンス 'ポインタではないことを忘れていました。 'CreateProcessAsUser'と' CreateProcess'に書き込み可能なコマンドラインが必要な理由は、[CreateProcess関数が入力コマンドラインを変更するのはなぜですか?](http://blogs.msdn.com/b/oldnewthing/archive/2009/06/)を参照してください。 01/9673254.aspx)。 –

0

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

関連する問題