2017-03-09 6 views
1

私は、ユーザーのホームディレクトリから構成ファイルを読み込むためのクロスプラットフォームライブラリを開発しています。この考え方は、コードを編集することなく構成パラメータを自動的に提供することです。Windowsでユーザーのホームディレクトリを取得する方法は?

このライブラリは、デスクトップアプリケーションやデーモン/サービスで使用できます。ほとんどのUNIX環境では、私はgetpwuid()を使ってユーザのホームディレクトリを得ることができます。 Windowsの場合told me私はSHGetKnownFolderPathを使用できますが、そのドキュメントにはデスクトップアプリケーションのみが記載されています。 Windows上でサービスを実行しているユーザーのために、このパスを取得する方法はありますか?

+0

なぜLinuxのタグを? –

+0

クロスプラットフォーム開発を行う人々の注意を喚起しようとしています。 – ruipacheco

+1

@ruipachecoクロスプラットフォーム開発を行う人は、とにかくこれらのタグの両方に従う可能性が最も高いですが、Linux開発のみを行う人はあなたの質問に答えられません。 –

答えて

0

サービスの状態でユーザーのホームディレクトリを取得しますか? - サービス状態にしたい場合は、ユーザトークンを取得するのにGetUserToken()を使用し、次にそれらを複製する必要があります。CreateprocessAsUser() - その他SHGetSpecialPath()SHGetTempPath()を使用する方が良いと思います。

+0

SHGetSpecialPathはデスクトップアプリケーションでも動作しますか? – ruipacheco

+1

アテンション!バージョン5.2〜5.3のデスクトップアプリケーションにのみ使用できます。 - MSDN [https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85)aspx] – Bryant

+0

そのページは404です。 – ruipacheco

0

あなたはこのことについてExpandEnvironmentStrings(...)

+0

その変数は必ずしも存在しません。 –

0

何を使用して、%HOMEPATH%で解決することができます:

#include <shlobj.h> 

WCHAR profilePath[MAX_PATH]; 
HRESULT result = SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, profilePath); 
if (SUCCEEDED(result)) { 
    // Do whatever you want with it 
    // For example: 
    // QString::fromWCharArray(profilePath) 
} 

でも、私はそれをテストしていません。

受信するのはwchar配列です(特殊文字を含むパスを処理するために必要です)。

hTokenパラメータを使用すると、現在のフォルダ以外の特別なフォルダをクエリすることもできます。

はまた、マニュアルを参照してください:https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx

私はスタートメニューの位置を取得したい、他の場合には、このコードを使用していました。この回答を参照してください:C++: How do I create a Shortcut in the Start Menu on Windows

+0

いいえ、いいえ、できません!プロファイルディレクトリは、設定ファイルの適切な場所ではありません。 'CSIDL_APPDATA'を試してください。 –

+0

私は彼がユーザのホームディレクトリを望んでいると理解していました。 – user1488118

+0

誰かが間違った質問をしたときにどのように対応するのが最適かについての[不一致](https://weblogs.asp.net/alex_papadimoulis/408925)があります。私は彼らが求めている情報ではなく、必要な情報を提供しているというキャンプにしっかりしています。 –

0

コンソールアプリケーション用の最も簡単な方法は、USERPROFILE環境変数を取得したり、HOMEDRIVEHOMEPATH環境変数の値を連結するかのいずれかです。

は、標準ライブラリにgetenv()機能を使用します。https://msdn.microsoft.com/en-us/library/tehxacec.aspx

プログラム例:

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
    printf("USERPROFILE = %s\n", getenv("USERPROFILE")); 
    printf("HOMEDRIVE = %s\n", getenv("HOMEDRIVE")); 
    printf("HOMEPATH = %s\n", getenv("HOMEPATH")); 
    return 0; 
} 

出力:

USERPROFILE = C:\Users\myuser 
HOMEDRIVE = C: 
HOMEPATH = \Users\myuser 
+0

デスクトップ/電話アプリでこれらのバーを上書きできますか? – ruipacheco

+0

ユーザープロファイルは、構成ファイルの正しい場所ではありません。 –

+0

@ruipacheco彼らが上書きされたり変更されたりすることは間違いありません。 – Paul

関連する問題