3

getenv( <stdlib.h>) 呼び出しを使用してスタートアップ オプションを取得する DLL があります。DLL を開く前に、同じプロセスでその変数を設定して、 経由でアクセスできるようにしたいと思いますgetenv。どの関数を使用して設定すればよいですか?

Windows には 2 つの環境変数セットがあることを知りました。1 つは win32 API (GetEnvironemntVariable、SetEnvironmentVariable) を介して操作され、もう 1 つは を使用して読み取ることができgetenv、おそらく_putenvを介して設定されます。

この関数は、おそらく ctypes を介して Python からアクセスできますか?

4

2 に答える 2

2

現在の〜VS2019の状況次のようです。

  • 関数の呼び出しは、getenvロード時に MS CRT が初期化するブロックから値を取得します。
  • GetEnvironmentVariableプロセス環境ブロックから値を取得するための呼び出し。
  • プロセス環境ブロックからの値のみSetEnvironmentVariableを更新する呼び出し。これらの変更は には表示されません。getenv
  • CRT ブロックの両方putenvの値を更新するための呼び出し、さらに Win32 を呼び出してプロセス環境ブロックを更新するための呼び出し。SetEnvironmentVariable

したがって、実際に使用する目的に関係なく、次のようになります。

  • 環境変数を設定するために使用_wputenv_sします - 両方を更新します。
  • 読み取りに使用::GetEnvironmentVariableW: 環境ブロックから読み取ります。これには、使用されたメソッドに関係なく、値が含まれます。

それにかんするgetenv

使用しているコードがコードと同じ MS CRT を使用している場合、getenvつまり、コードが CRT に動的にリンクされており、実際に同じバージョンを使用している場合は、いつでも を使用できますputenv

DLL (およびその CRT) が動的または遅延ロードさputenvれ、dll がロードされる前に呼び出すことができる場合は、それを使用できます。

(これは推測であり、私はこれを正確にテストしていません:) DLL が既にプロセスにロードされていて、静的にリンクされた CRT、または使用している CRT とは別の CRT を使用している場合、その getenv呼び出しの環境データは既にロードされています。 DLL 境界の側で何もしないと、それが変わります。この場合、運が悪いと思います。

参照:

于 2022-02-04T09:37:59.567 に答える