망각/Windows Shell 썸네일형 리스트형 OLE Drag and Drop 문제 SodExplorer 테스트중 최근에 발견했다. 드래그앤드롭으로 파일 복사시에 SodExplorer가 드래그한 소스창으로 쓰이면 (즉, SodExplorer에서 파일을 끌어 다른 프로그램으로 복사할 경우) 복사 다이얼로그 창이 닫히기 전까지 SodExplorer창이 블럭되어, 입력을 받지 못했다. 드롭한 타겟창일 경우에는 문제가 발생하지 않았다. 헌데, 이런 상황은 SodExplorer band의 경우에 달랐다. 윈도우 탐색기와, 작업표시줄 툴바의 경우, 소스창으로 쓰일 경우에도 블럭되지 않았고 인터넷익스플로어의 경우에는 역시 블럭되었다. 차이점은 DLL이 explorer.exe에 로드되어 실행되느냐 아니냐에 따른 것으로 판단된다. IE의 경우 iexplorer.exe 프로세스가 따로 실행되고, 탐색기와.. 더보기 IDropTargetHelper 사용 문제 IDropTargetHelper를 사용하려 했는데 노드 하이라이트가 안된다. 밑에 그림처럼 드래그한 이미지는 뜨지만 트리노드위에 올라가도 노드 하이라이트가 되지 않는다. IDropTargetHelper 인터페이스의 메서드로 이런 저런 시도를 해봤는데, 아래처럼 트리뷰 영역이 지워지고 깜빡이는 현상이 나타난다. 미칠 노릇이다. 결국은 IDropTargetHelper 사용 중지...(아래 스샷은 마우스포인터가 빠져서 찍혔다). 적지 않은 시간동안 삽질을 하고 검색을 했는데도 해결도 못하고 관련 글을 찾지도 못했다. 아놔, 이유가 무엇인지 정말 궁금하다! 더보기 SHChangeNotifyRegister 사용중 의문점 첫번째- PIDL 관련, simple PIDL? ::SHChangeNotifyRegister(hwnd, SHCNRF_ShellLevel, SHCNE_RENAMEFOLDER, MY_MESSAGE, 1, &entry); 위 처럼 폴더의 이름변경을 알기 위해 메시지를 등록했다. 전에 글에서 적은 것처럼 메시지의 WPARAM로 변경된 폴더 관련 PIDL이 넘어온다. 이 PIDL(absolute)을 이용해 ::SHBindToParent() 함수에서 부모폴더의 IShellFolder 인터페이스와 부모폴더에 상대적인 PIDL을 얻었다. ::SHBindToParent(fullyPidl, IID_IShellFolder, (void**)&iparent, (LPCITEMIDLIST*)&childPidl)) iparent->.. 더보기 폴더 이름 얻기에 관해 (::SHGetFileInfo, IShellFolder::GetDisplayNameOf) PIDL로 폴더의 이름을 얻기위해 ::SHGetFileInfo()를 사용중이었는데 "My Documents"나 "My Music" 같은 가상 폴더의 경우, "Administrator's Music" 같은 식으로 윈도우 계정의 이름이 붙어서 리턴됐다. IShellFolder::GetDisplayNameOf()를 사용하면 "My Music" 처럼 탐색기에 보여지는 이름대로 리턴된다. 한가지 더, ::SHGetFileInfo()의 경우 IDLIST_RELATIVE 같은 부모폴더의 상대적인 PIDL을 전달하면 "C:\"나 "CD Drive (E:)" 같은 "My Computer"에 바로 붙은 노드들은 이름이 빈 문자열로 리턴되는 경우가 있다. 이럴 때 IDLIST_ABSOUTE의 PIDL을 전달해주면 제대로 이.. 더보기 SHChangeNotifyRegister 사용에 대해 폴더의 이름 변경을 알기위해 ::SHChangeNotifyRegister() 함수를 사용하려 한다. 이 함수는 지정 이벤트가 일어날 경우 보내질 메시지와 메시지를 받을 핸들을 받는다. ULONG SHChangeNotifyRegister( HWND hwnd, int fSources, LONG fEvents, UINT wMsg, int cEntries, const SHChangeNotifyEntry *pshcne ); MSDN에는 이 함수와 관련 함수들에 대해 설명이 부족하다(내가 못 찾는 건가!). 일단 이벤트가 발생해서 윈도우로 메시지가 전달됐다고 하자. 관련 정보는 어떻게 얻을 수 있는건가? 메시지의 WPARAM, LPARAM 값은 어떻게 사용해야 하나? 관련 정보가 MSDN에 없다; 구글링으로 찾아본.. 더보기 IDeskBand 구현시 레지스트리 항목에 대해 IDeskBand 구현시, MSDN의 Creating Custom Explorer Bars, Tool Bands, and Desk Bands 항목에 나온 레지스트리 등록으로 등록된 밴드가 메뉴에 나오지 않았다. (내 시스템은 XP x64) SDK 예제를 보 OS 버젼검사를 해서 다른 레지스트리 값도 등록을 해주고 있었다. OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(osvi); ::GetVersionEx(&osvi); if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) { // HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Shell Extensions/Ap.. 더보기 IDeskBand 구현시 IInputObject 인터페이스 의문점 데스크밴드를 구현중에 사용자 입력을 받기 위해 IInputObject 인터페이스를 함께 구현하였고, 이와 관련하여 문제가 있어 며칠동안 테스트와 검색으로 삽질을 했다. MSDN포럼에도 글을 올려보았지만 스스로 내용정리도 안되었고 허접한 영어실력 때문인지 3일이 지난 지금까지 리플을 달리지 않고 있다. 아무튼 블로그 개장 기념으로 글 하나는 올려야 될 것 같아. 좀 더(한글로-ㅅ-) 정리를 해보자 한다. 여기서 내가 말하는 데스크밴드는 태스크바(작업표시줄)에 표시되는 빠른실행과 알송리모컨같은 밴드를 말하고, IInputObject 인터페이스의 메서드는 다음과 같다. HasFocusIO Determines if one of the object's windows has the keyboard focus. Tr.. 더보기 이전 1 다음