私のコードは正しいですか?コンパイルできますが、正常に動作しないようです。コード内で%USERPROFILE%を正しく使用する方法は?
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
私はそれをユーザーのフォルダに向けていますが、まだ動作しません。
私のコードは正しいですか?コンパイルできますが、正常に動作しないようです。コード内で%USERPROFILE%を正しく使用する方法は?
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
私はそれをユーザーのフォルダに向けていますが、まだ動作しません。
答えは、環境変数をまったく使用しないということです。むしろ、特別なフォルダのパスを取得するために特別に設計されたシェル関数を使用します。
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.
}
は、それがSHGetSpecialFolderPathの機能を使用することをお勧めします。ただし、GetEnvironmentVariable関数を使用して、システムに設定されているその他の変数を取得することができます。
TCHAR szBuf[MAX_PATH] = {0};
::GetEnvironmentVariable(_T("USERPROFILE"), szBuf, MAX_PATH);
さらにコードを表示することはありますか? – marc