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번 모두 발생하지 않는다. 하지만, 이걸 권장할 순 없다.



신고

+ Recent posts