DefView не отрисовывается.
От:
Dmitry_P
Дата: 20.07.10 12:20
Оценка:
Привет
Я разрабатываю свой компонент который кастомизирует вид explorer'а, точнее добавляет ещё одно окно. Это COM компонент который реализует интерфейсы IPersistFolder и IShellView. Для того чтобы заставить win explorer использовать мой компонент я добавляю туда скрытый файл desktop.ini который содержит две строчки: [.ShellClassInfo] и
UICLSID={1CA2A0A0-39CD-4AC7-BE28-CB12CE74D4AF}.
Для того чтобы оставить стандартный вид exlporer я создаю стандартную вьюху (DefView о котором мне говорит Spy++) используя метод SHCreateShellFolderView из вызова IShellView.CreateViewWindow. Однако данная вьюха пустая и ничего не показывает.
Что я упускаю или есть какой нибудь workaround этого?
Вот код компонента:
[Guid("1CA2A0A0-39CD-4AC7-BE28-CB12CE74D4AF")]
class GSTestView : IPersistFolder, IShellView
{
IShellFolder _shellFolder;
IShellView _defView = null;
IntPtr _viewHwnd;
public void GetClassID(ref Guid pClassID)
{
pClassID = new Guid("1CA2A0A0-39CD-4AC7-BE28-CB12CE74D4AF");
}
public long Initialize(IntPtr pidl)
{
IShellFolder folder;
SHGetDesktopFolder(out folder);
IntPtr ppvOut;
Guid iFolderGuid = typeof(IShellFolder).GUID;
folder.BindToObject(pidl, IntPtr.Zero, ref iFolderGuid, out ppvOut);
if (ppvOut != IntPtr.Zero)
{
_shellFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(ppvOut, typeof(IShellFolder));
}
return 0;
}
public void CreateViewWindow(IntPtr psvPrevious, ref FOLDERSETTINGS pfs, IShellBrowser psb, ref RECT prcView, ref IntPtr phWnd)
{
GetShellView(out _defView, psvPrevious);
// GetShellViewEx(out _defView, psvPrevious);
if (_defView != null)
{
IntPtr hWndChild = IntPtr.Zero;
_defView.CreateViewWindow(psvPrevious, pfs, psb, prcView, ref hWndChild);
_defView.GetWindow(out _viewHwnd);
}
}
private void GetShellView(out IShellView defView, IntPtr psvPrevious)
{
IntPtr iUnk = Marshal.GetIUnknownForObject(_shellFolder);
Guid iFolderGuid = typeof(IShellFolder).GUID;
IntPtr iFolder;
int res = Marshal.QueryInterface(iUnk, ref iFolderGuid, out iFolder);
IntPtr iUnkCallback = Marshal.GetIUnknownForObject(this);
Guid iCallbackGuid = typeof(IShellFolderViewCB).GUID;
IntPtr iCallback;
res = Marshal.QueryInterface(iUnkCallback, ref iCallbackGuid, out iCallback);
var sfv = new SFV_CREATE
{
cbSize = (uint)Marshal.SizeOf(typeof(SFV_CREATE)),
pshf = iFolder,
psfvcb = iCallback,
psvOuter = psvPrevious
};
SHCreateShellFolderView(ref sfv, out defView);
}
public void GetWindow(out IntPtr phwnd)
{
phwnd = _viewHwnd;
}
public void ContextSensitiveHelp(bool fEnterMode)
{
if (_defView != null)
{
_defView.ContextSensitiveHelp(fEnterMode);
}
}
public long TranslateAcceleratorA(IntPtr pmsg)
{
if (_defView != null)
{
return _defView.TranslateAcceleratorA(pmsg);
}
return 0;
}
public void EnableModeless(bool fEnable)
{
if (_defView != null)
{
_defView.EnableModeless(fEnable);
}
}
public void UIActivate(uint uState)
{
if (_defView != null)
{
_defView.UIActivate(uState);
}
}
public void Refresh()
{
if (_defView != null)
{
_defView.DestroyViewWindow();
}
}
public void DestroyViewWindow()
{
if (_defView != null)
{
_defView.DestroyViewWindow();
_defView = null;
}
}
public void GetCurrentInfo(ref FOLDERSETTINGS pfs)
{
if (_defView != null)
{
_defView.GetCurrentInfo(pfs);
}
}
public void AddPropertySheetPages(long dwReserved, ref IntPtr pfnPtr, int lparam)
{
if (_defView != null)
{
_defView.AddPropertySheetPages(dwReserved, ref pfnPtr, lparam);
}
}
public void SaveViewState()
{
if (_defView != null)
{
_defView.SaveViewState();
}
}
public void SelectItem(IntPtr pidlItem, uint uFlags)
{
if (_defView != null)
{
_defView.SelectItem(pidlItem, uFlags);
}
}
public long GetItemObject(uint uItem, ref Guid riid, ref IntPtr ppv)
{
ppv = IntPtr.Zero;
if (_defView != null)
{
_defView.GetItemObject(uItem, ref riid, ref ppv);
}
if (ppv.ToInt32() == 0)
{
Marshal.QueryInterface(Marshal.GetIUnknownForObject(_shellFolder), ref riid, out ppv);
}
return 0;
}
[DllImport("Shell32.dll")]
internal static extern void SHGetDesktopFolder(out IShellFolder folder);
[DllImport("Shell32.dll")]
internal static extern long SHCreateShellFolderView(ref SFV_CREATE pcsfv, out IShellView ppsv);
}
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить