Winapi SetThemeAppProperties禁用COM公用对话框

Winapi SetThemeAppProperties禁用COM公用对话框,winapi,com,fileopendialog,common-dialog,windows-themes,Winapi,Com,Fileopendialog,Common Dialog,Windows Themes,使用带有标志STAP\u ALLOW\u CONTROLS的参数调用,以返回错误0x80040111 示例代码如下: HRESULT hResult; CComPtr< IFileOpenDialog > pFileOpenInterface1; CComPtr< IFileOpenDialog > pFileOpenInterface2; hResult = ::CoCreateInstance( CLSID_FileOpenDialog, NULL, CLSCTX_

使用带有标志
STAP\u ALLOW\u CONTROLS
的参数调用,以返回错误
0x80040111

示例代码如下:

HRESULT hResult;
CComPtr< IFileOpenDialog > pFileOpenInterface1;
CComPtr< IFileOpenDialog > pFileOpenInterface2;

hResult = ::CoCreateInstance( CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &pFileOpenInterface1 ) );
::SetThemeAppProperties( 0 );
hResult = ::CoCreateInstance( CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &pFileOpenInterface2 ) );
HRESULT-HRESULT;
CComPtrpFileOpenInterface1;
CComPtrpFileOpenInterface2;
hResult=::CoCreateInstance(CLSID_FileOpenDialog,NULL,CLSCTX_INPROC_服务器,IID_PPV_参数(&pFileOpenInterface1));
::设置EAPProperties(0);
hResult=::CoCreateInstance(CLSID_FileOpenDialog,NULL,CLSCTX_INPROC_服务器,IID_PPV_参数(&pFileOpenInterface2));
为了使其成为运行代码,我(在Visual Studio 2010 Professional中)创建了一个简单的Win32 GUI应用程序,并将该代码添加到菜单“帮助”|关于处理程序”


为什么会这样?如何解决这个问题?

在所有控件上禁用视觉样式是一个相当沉重的负担。最新版本的对话框不支持这一点也不奇怪。尝试使用GetOpenFileName()返回旧的shell对话框界面。接下来删除启用6.0版本的通用控件的清单条目。可能有点讨厌剥皮的想法。

可能是一个愚蠢的问题:但是在尝试使用CoCreateInstance之前是否调用()和()


我的猜测是,如果设置了STAP_ALLOW_CONTROLS标志,则调用SetThemeAppProperties会自动初始化COM。但是,如果没有设置该标志,您必须自己进行操作。

使用模板自定义常用对话框在Windows 7上并不容易。首先,您必须强制GetOpenFileName从DoModal调用遗留函数,这可以通过m_bVistaStyle=false轻松完成。但我不得不处理一些断言

断言(pThreadState->m_pAlternateWndInit==NULL)
pThreadState->m_pAlternateWndInit=NULL

我仍然不确定它是干什么用的,但它可以通过处理WM_NCDESTROY而简单地“解决” 分配

\u AFX\u THREAD\u STATE*pThreadState=AfxGetThreadState()
if(::IsWindow(pThreadState->m_pAlternateWndInit->m_hWnd))
痕迹(“可怕的…”)
否则
pThreadState->m_pAlternateWndInit=NULL
跟踪(“WM_NCDESTROY”)
返回false

在窗口程序中。然而,我没有做到的是从OpenFile对话框中获取选定的文件名
关于CDN_SELCHANGE。发送CDM_GETFILEPATH仅返回256个字符,无论缓冲区与此消息一起使用多大。也许有人知道在windows 7上执行此操作的方法?

在MSDN论坛的原始帖子中缺少活动后,我重新发布了此消息()。如果您解释一下为什么在原始应用程序中调用SetThemeAppProperties时,在启动时在为应用程序提供自己蒙皮的模块中调用SetThemeAppProperties,可能会有所帮助。(通常我没有太多的选项,老实说,我不知道模块为什么调用这个函数。)但这个问题似乎更普遍,因为在一个示例应用程序中也会发生同样的事情(如问题所述)。如果重新添加该标志,会发生什么情况?然后第二个CoCreateInstance成功。GetOpenFileName将使用“新建公用项”对话框。您必须说服它使用旧版对话框,例如使用OPENFILENAME的一个旧版本。@David-我很确定情况并非如此。众所周知,3.5中的WPF获得了非Vista增强对话框,因为它使用GetOpenFileName()。它在4.0中更新为使用IFileDialog。@Hans
GetOpenFileName()
确实提供了新对话框,如果您使用正确的话。只要不需要定制,就可以通过旧函数调用获得新对话框。只有当你需要定制时,你才会被迫进入新的COM界面。问题是我们正在向对话框(一个复选框)添加自定义控件,这在新的COM对话框中很容易实现,而旧的对话框需要一些未记录的黑客来完成(如果我没有弄错的话)。而且它们看起来很难看。@Adam对旧对话框的定制被记录下来并使用对话框模板。虽然他们很丑,但你避开他们是对的。您的问题是蒙皮代码。那是你应该用兰斯喷的疖子。我怀疑它不起作用,但还是试了试,希望它能起作用。但事实并非如此。线索是第一个
CoCreateInstance
调用总是成功的。