VCi를 업데이트하면서 중요한 문제점을 두 개 발견했다.
VCi 포스팅에 포함시키기엔 애매해서 별도로 포스팅.
1. Vista/W7/W8에서 drag-n-drop 정상적으로 사용하기
윈도우를 사용하면서 UAC를 끄고 관리자 모드로만 사용했다.
그런데, 이번에 PC를 포맷하면서 UAC를 켜고 써보니 관리자 권한에서는 drag-n-drop이 동작하지 않았다.
처음 발견된 새로운 버그라고 혼자 망상(?)을 잠시 했지만, 찾아보니 다 끝난 얘기다.
Vista 부터는 권한이 낮은 프로세스에서 높은 프로세스로 메시지가 전달되지 않는다.
애초에 UAC를 끄면 이런 문제가 없겠지만, 그건 좀 활동적X 스타일 해결책이고…
제대로 된 해결책은 ChangeWindowMessageFilter()로 메시지를 필터에 등록하는 것.
창의 초기화 부분에 아래 코드를 추가하면 된다.
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
그런데, 여기서 사소한(?) 문제가 있다.
1. Visual C++ 6.0에선 ChangeWindowMessageFilter()를 해석하지 못함
2. WM_COPYGLOBALDATA는 어떤 Visual Studio에서도 선언이 되어있지 않음
그래서, 이런 식으로 코드를 작성했다.
// 선언
#ifndef CHANGEWINDOWMESSAGEFILTER
typedef BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(UINT message, DWORD dwFlag);
#endif
#ifndef MSGFLT_ADD
#define MSGFLT_ADD 1
#endif
#ifndef WM_COPYGLOBALDATA
#define WM_COPYGLOBALDATA 0x0049
#endif
// 초기화
CHANGEWINDOWMESSAGEFILTER ChangeWindowMessageFilter = NULL;
HINSTANCE hDll;
hDll = LoadLibrary(_T("USER32.DLL"));
if (hDll) {
ChangeWindowMessageFilter
=(CHANGEWINDOWMESSAGEFILTER)GetProcAddress(hDll,"ChangeWindowMessageFilter");
if (ChangeWindowMessageFilter) {
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
}
FreeLibrary(hDll);
}
※ 참고 사이트: code project
2. 임시 폴더에 한글이 들어있으면 문제 발생
이 문제는 정확한 원인을 파악하지는 못하고, 현상만 확인했다.
관리자 모드로 프로그램을 실행하면 임시 폴더에 한글이 있어도 별 문제가 없다.
그런데, 사용자 모드에서 실행하면 일부 프로그램이 제대로 동작하지 않는다.
웃긴 건 임시 폴더에서만 그런 현상이 발생한다는 것이다.
그래서 임시 폴더에 한글이 들어있으면 최대한 한글이 들어있지 않은 폴더를 알아서 찾도록 수정헀다.
정확한 순서는 기 지정된 폴더 → 윈도우 임시 폴더 → c:\windows\temp 순.
이 과정에서 적합한 폴더를 찾지 못하면 경고 메시지를 출력한다.
덧1. 2번 문제는 (1번과는 반대로) 사용자 모드에서만 발생한다. (즉, 이 두 문제는 동시에 발생하지 않음)
덧2. UAC를 끄면 1번, 2번 모두 발생하지 않는다. 하지만, 이걸 권장할 순 없다.