2011-07-26 19 views
2

私のコードは正しいですか?コンパイルできますが、正常に動作しないようです。コード内で%USERPROFILE%を正しく使用する方法は?

CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png"); 

私はそれをユーザーのフォルダに向けていますが、まだ動作しません。

+0

さらにコードを表示することはありますか? – marc

答えて

9

答えは、環境変数をまったく使用しないということです。むしろ、特別なフォルダのパスを取得するために特別に設計されたシェル関数を使用します。

Windows Vista以降では、その機能はSHGetKnownFolderPathです。パスを取得するフォルダを特定するには、KNOWNFOLDERID valuesが必要です。あなたの場合、それはFOLDERID_Profileになります。

以前のバージョンのWindows(XPなど)をターゲットにする必要がある場合は、代わりにSHGetSpecialFolderPath functionを使用する必要があります。パスを取得するフォルダを識別する値はCSIDLです。繰り返しますが、あなたの場合、それはCSIDL_PROFILEになります。


もちろん、ユーザーのプロファイルフォルダに直接データを保存しないでください。だから、あなたが示したコードのほんの一部は、デモ目的のためだけです。アプリケーションは、特定の場所にあるファイルを作成する必要があります。の下に、アプリケーションデータ格納用に設計されたユーザープロファイルフォルダ。

これらの場所はCSIDL_APPDATAまたはCSIDL_LOCAL_APPDATAです。ユーザーが変更できる必要があり、自分の扱うデータを作成する場合は、そのデータをユーザーのドキュメントフォルダ(CSIDL_MYDOCUMENTS)に保存することが適切です。

詳細な使用方法についてはmy answer hereをご覧ください。 MFCのCStringクラスを使用して

TCHAR szFolderPath[MAX_PATH]; 
if (!SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_APPDATA, FALSE)) 
{ 
    // Uh-oh! An error occurred; handle it. 
} 

または、::


サンプルコードコーディが示唆したように

CString buffer; 
BOOL bRet = SHGetSpecialFolderPath(NULL, buffer.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE); 
buffer.ReleaseBuffer(); 
if (!bRet) 
{ 
    // Uh-oh! An error occurred; handle it. 
} 
1

は、それがSHGetSpecialFolderPathの機能を使用することをお勧めします。ただし、GetEnvironmentVariable関数を使用して、システムに設定されているその他の変数を取得することができます。

TCHAR szBuf[MAX_PATH] = {0}; 
::GetEnvironmentVariable(_T("USERPROFILE"), szBuf, MAX_PATH); 
関連する問題