EarOwlの日記: GetOpenFileName() でカレントディレクトリが変更される 2
http://srad.jp/security/comments.pl?sid=505365&cid=1814203
さくっとテストコードを書いてみた。
C:\test_pgm>cat WinMain.c
#include <tchar.h>
#include <windows.h>
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
TCHAR szCurDir[MAX_PATH];
DWORD dwLen;
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH] = _T("");
dwLen = GetCurrentDirectory(MAX_PATH, szCurDir);
if (dwLen > MAX_PATH) {
return 0;
}
MessageBox(NULL, szCurDir, _T("Current Directory"), MB_OK);
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
GetOpenFileName(&ofn);
dwLen = GetCurrentDirectory(MAX_PATH, szCurDir);
if (dwLen > MAX_PATH) {
return 0;
}
MessageBox(NULL, szCurDir, _T("Current Directory"), MB_OK);
return 0;
}
C:\test_pgm>cl WinMain.c /link User32.lib Comdlg32.lib
C:\test_pgm>.\WinMain.exe
…本当だ。 GetOpenFileName() のダイアログで『開く』を選択するとカレントディレクトリが変更されてる。
以下、確認環境。
Microsoft Windows XP [Version 5.1.2600]
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
WinMain.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
それはみんなが一度は通る道、たぶん。 (スコア:0)
なんてコードが書いてあった。
Windows はこういうアホなことが多すぎて困る。
Re:それはみんなが一度は通る道、たぶん。 (スコア:1)
なるほど、 OFN_NOCHANGEDIR をセットすればいいのか…と思ったら、
http://msdn.microsoft.com/ja-jp/library/ms646839.aspx [microsoft.com] には
"This flag is ineffective for GetOpenFileName." なんて書いてありました。
ところが、実際に試してみるとカレントディレクトリは変更されなくなっていました。
一体、何が正しいのやら…。