WritePrivateProfileStringA 関数 (winbase.h)

初期化ファイルの指定したセクションに文字列をコピーします。

メモ この関数は、16 ビット バージョンの Windows との互換性のためにのみ提供されます。 アプリケーションでは、レジストリに初期化情報を格納する必要があります。
 

構文

BOOL WritePrivateProfileStringA(
  [in] LPCSTR lpAppName,
  [in] LPCSTR lpKeyName,
  [in] LPCSTR lpString,
  [in] LPCSTR lpFileName
);

パラメーター

[in] lpAppName

文字列のコピー先となるセクションの名前。 セクションが存在しない場合は、作成されます。 セクションの名前は大文字と小文字は区別されません。文字列には、大文字と小文字の任意の組み合わせを指定できます。

[in] lpKeyName

文字列に関連付けるキーの名前。 指定したセクションにキーが存在しない場合は、キーが作成されます。 このパラメーターが NULL の場合、セクション内のすべてのエントリを含むセクション全体が削除されます。

[in] lpString

ファイルに書き込まれる null で終わる文字列。 このパラメーターが NULL の場合、 lpKeyName パラメーターが指すキーは削除されます。

[in] lpFileName

初期化ファイルの名前。

Unicode 文字を使用してファイルが作成された場合、この関数は Unicode 文字をファイルに書き込みます。 それ以外の場合、関数は ANSI 文字を書き込みます。

戻り値

関数が初期化ファイルに文字列を正常にコピーした場合、戻り値は 0 以外になります。

関数が失敗した場合、または最近アクセスした初期化ファイルのキャッシュされたバージョンをフラッシュした場合、戻り値は 0 になります。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

初期化ファイルのセクションには、次の形式が必要です。

[section]
key=string
      .
      .
      .

lpFileName パラメーターにファイルの完全なパスとファイル名が含まれていない場合、WritePrivateProfileString は Windows ディレクトリでファイルを検索します。 ファイルが存在しない場合、この関数は Windows ディレクトリにファイルを作成します。

lpFileName に完全なパスとファイル名が含まれており、ファイルが存在しない場合は、WritePrivateProfileString によってファイルが作成されます。 指定したディレクトリは既に存在している必要があります。

システムは、パフォーマンスを向上させるために、最新のレジストリ ファイル マッピングのキャッシュ されたバージョンを保持します。 すべてのパラメーターが NULL の場合、関数はキャッシュをフラッシュします。 システムがキャッシュされたバージョンのファイルを編集している間、ファイル自体を編集するプロセスでは、キャッシュがクリアされるまで元のファイルが使用されます。

システムは、次のレジストリ キーで定義されたマッピングを使用して、ほとんどの .ini ファイル参照をレジストリにマップします。

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               IniFileMapping

このマッピングは、アプリケーションがシステム コンポーネントの初期化ファイル (Control.ini、System.ini、Winfile.ini など) を変更する場合に発生する可能性があります。 この場合、関数は初期化ファイルではなくレジストリに情報を書き込みます。ストレージの場所の変更は、関数の動作には影響しません。

プロファイル関数では、次の手順を使用して初期化情報を検索します。

  1. IniFileMapping キーの下にある初期化ファイルの名前をレジストリで探します。
  2. lpAppName で指定されたセクション名を探します。 これは、初期化ファイルの名前を持つキーの名前付き値、またはこの名前を持つサブキーになります。または、名前が値またはサブキーとして存在しません。
  3. lpAppName で指定されたセクション名が名前付き値の場合、その値はレジストリ内のセクションのキーを検索する場所を指定します。
  4. lpAppName で指定されたセクション名がサブキーの場合、そのサブキーの名前付き値は、レジストリ内のセクションのキーを検索する場所を指定します。 探しているキーが名前付き値として存在しない場合は、キーを検索するレジストリの既定の場所を指定する名前のない値 (名前>なし)< が表示されます。
  5. lpAppName で指定されたセクション名が名前付き値またはサブキーとして存在しない場合は、名前のない値 (名前>なしとして<表示) があり、レジストリ内でセクションのキーを検索する既定の場所を指定します。
  6. セクション名のサブキーまたはエントリがない場合は、ディスク上の実際の初期化ファイルを探し、その内容を読み取ります。
他のレジストリの場所を指定するレジストリ内の値を見ると、.ini ファイル マッピングの動作を変更するプレフィックスがいくつかあります。
  • ! - この文字により、すべての書き込みがレジストリとディスク上の .ini ファイルの両方に強制的に移動されます。
  • # - この文字により、新しいユーザーがセットアップ後に初めてログインしたときに、レジストリ値が Windows 3.1 .ini ファイルの値に設定されます。
  • @ - この文字は、要求されたデータがレジストリに見つからない場合に、ディスク上の .ini ファイルに読み取りが行われるのを防ぎます。
  • USR: - このプレフィックスは HKEY_CURRENT_USERを表し、プレフィックスの後のテキストはそのキーに対して相対的です。
  • SYS: - このプレフィックスは HKEY_LOCAL_MACHINE\SOFTWAREを表し、プレフィックスの後のテキストはそのキーに対して相対的です。
WritePrivateProfileString 関数を使用してレジストリにファイル情報 .ini 入力するアプリケーションは、次のガイドラインに従う必要があります。
  • 指定した名前の .ini ファイルがシステムに存在しないことを確認します。
  • レジストリに、.ini ファイルを指定するキー エントリがあることを確認します。 このエントリは、\Microsoft\Windows NT\CurrentVersion\IniFileMappingHKEY_LOCAL_MACHINE\SOFTWARE パスの下に存在する必要があります。
  • セクションを指定する .ini ファイル キー エントリの値を指定します。 つまり、アプリケーションは、.ini ファイルまたはレジストリ エントリ内に表示されるため、セクション名を指定する必要があります。 [My Section] の例を次に示します。
  • システム ファイルの場合は、追加値として SYS を指定します。
  • アプリケーション ファイルの場合は、追加された値内で USR を指定します。 "My Section: USR: App Name\Section" の例を次に示します。 また、USR は HKEY_CURRENT_USER 下のマッピングを示しているため、アプリケーションでは、 HKEY_CURRENT_USERの下 にキーを作成して、追加された値に一覧表示されているアプリケーション名を指定する必要もあります。 この例では、"アプリ名" になります。
  • 前の手順に従った後、アプリケーション セットアップ プログラムは WritePrivateProfileString を呼び出し、最初の 3 つのパラメーターを NULL に設定し、4 番目のパラメーターを INI ファイル名に設定する必要があります。 例:

    WritePrivateProfileString( NULL, NULL, NULL, L"appname.ini" );

  • このような呼び出しにより、次のシステムの再起動前に、.ini ファイルのレジストリへのマッピングが有効になります。 システムは、マッピング情報を共有メモリに再読み込みします。 アプリケーションの今後の呼び出しで .ini ファイルのレジストリへのマッピングが表示されるために、ユーザーはアプリケーションをインストールした後にコンピューターを再起動する必要はありません。

次のサンプル コードは、上記のガイドラインを示しており、いくつかの前提条件に基づいています。

  • アプリ名という名前のアプリケーションがあります。
  • そのアプリケーションでは、AppName.ini という名前の .ini ファイルが使用されます。
  • .ini ファイルには、次のようなセクションがあります。
    [Section1] 
      FirstKey = It all worked out okay. 
      SecondKey = By golly, it works. 
      ThirdKey = Another test.
    
  • アプリケーションの今後の呼び出しでレジストリへの .ini ファイルのマッピングが表示されるために、ユーザーはシステムを再起動する必要はありません。
#include <windows.h> 
#include <tchar.h>
#include <stdio.h> 
 
int main() 
{ 
   TCHAR   inBuf[80]; 
   HKEY   hKey1, hKey2; 
   DWORD  dwDisposition; 
   LONG   lRetCode; 
   TCHAR   szData[] = TEXT("USR:App Name\\Section1");
 
   // Create the .ini file key. 
   lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE, 
       TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping\\appname.ini"), 
       0, 
       NULL, 
       REG_OPTION_NON_VOLATILE, 
       KEY_WRITE, 
       NULL, 
       &hKey1, 
       &dwDisposition); 
 
   if (lRetCode != ERROR_SUCCESS)
   { 
      printf ("Error in creating appname.ini key (%d).\n", lRetCode); 
      return (0) ; 
   } 
 
   // Set a section value 
   lRetCode = RegSetValueEx ( hKey1, 
                              TEXT("Section1"), 
                              0, 
                              REG_SZ, 
                              (BYTE *)szData, 
                              sizeof(szData)); 
 
   if (lRetCode != ERROR_SUCCESS) 
   { 
      printf ("Error in setting Section1 value\n"); 
      // Close the key
      lRetCode = RegCloseKey( hKey1 );
      if( lRetCode != ERROR_SUCCESS )
      {
         printf("Error in RegCloseKey (%d).\n", lRetCode);
         return (0) ; 
      }
   } 
 
   // Create an App Name key 
   lRetCode = RegCreateKeyEx ( HKEY_CURRENT_USER, 
                               TEXT("App Name"), 
                               0, 
                               NULL, 
                               REG_OPTION_NON_VOLATILE,
                               KEY_WRITE, 
                               NULL, 
                               &hKey2, 
                               &dwDisposition); 
 
   if (lRetCode != ERROR_SUCCESS) 
   { 
      printf ("Error in creating App Name key (%d).\n", lRetCode); 

      // Close the key
      lRetCode = RegCloseKey( hKey2 );
      if( lRetCode != ERROR_SUCCESS )
      {
         printf("Error in RegCloseKey (%d).\n", lRetCode);
         return (0) ; 
      }
   } 
 
   // Force the system to read the mapping into shared memory 
   // so that future invocations of the application will see it 
   // without the user having to reboot the system 
   WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" ); 
 
   // Write some added values 
   WritePrivateProfileString (TEXT("Section1"), 
                              TEXT("FirstKey"), 
                              TEXT("It all worked out OK."), 
                              TEXT("appname.ini")); 
   WritePrivateProfileString (TEXT("Section1"), 
                              TEXT("SecondKey"), 
                              TEXT("By golly, it works!"), 
                              TEXT("appname.ini")); 
   WritePrivateProfileString (TEXT("Section1"), 
                              TEXT("ThirdKey"), 
                              TEXT("Another test..."), 
                              TEXT("appname.ini")); 

   // Test 
   GetPrivateProfileString (TEXT("Section1"), 
                            TEXT("FirstKey"), 
                            TEXT("Error: GPPS failed"), 
                            inBuf, 
                            80, 
                            TEXT("appname.ini")); 
   _tprintf (TEXT("Key: %s\n"), inBuf); 
 
   // Close the keys
   lRetCode = RegCloseKey( hKey1 );
   if( lRetCode != ERROR_SUCCESS )
   {
      printf("Error in RegCloseKey (%d).\n", lRetCode);
      return(0);
   }

   lRetCode = RegCloseKey( hKey2 );
   if( lRetCode != ERROR_SUCCESS )
   {
      printf("Error in RegCloseKey (%d).\n", lRetCode);
      return(0);
   }
   
   return(1); 
}

注意

winbase.h ヘッダーは、WritePrivateProfileString をエイリアスとして定義し、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー winbase.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

GetPrivateProfileString

WriteProfileString