0

使用未设置SetThemeAppProperties标志的参数调用Common Dialogs (或在列表 File Open Dialog, )返回 error 。STAP_ALLOW_CONTROLSCoCreateInstanceCLSID_FileOpenDialog0x80040111

示例代码如下:

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 ) );

为了使它成为运行代码,我(在 Visual Studio 2010 Professional 中)创建了一个简单的 Win32 GUI 应用程序,并将该代码添加到菜单帮助|关于处理程序。

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

4

3 回答 3

1

在所有控件上禁用视觉样式是一个非常沉重的锤子。最新版本的对话框不支持它并不奇怪。尝试使用 GetOpenFileName() 回退到旧的 shell 对话框界面。接下来删除启用 6.0 版本的通用控件的清单条目。也许对剥皮的想法有点厌恶。

于 2011-03-11T07:26:25.370 回答
0

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

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

我仍然不确定它的用途,但它可以通过处理 WM_NCDESTROY 并简单地分配来“解决”

_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
if( ::IsWindow( pThreadState->m_pAlternateWndInit->m_hWnd ) )
TRACE( "可怕..." );
否则
pThreadState->m_pAlternateWndInit = NULL;
跟踪(“WM_NCDESTROY”);
返回假;

在窗口过程中。但是我没有管理的是从 CDN_SELCHANGE 上的 OpenFile 对话框中获取选定的文件名。发送 CDM_GETFILEPATH 仅返回 256 个字符,无论使用此消息的缓冲区有多大。也许有人知道在 Windows 7 上执行此操作的方法?

于 2011-03-11T13:24:04.853 回答
0

也许是一个愚蠢的问题:但是在尝试使用 CoCreateInstance 之前,您是否调用了InitCommonControlsEx () 和CoInitializeEx ()?

我的猜测是,如果设置了 STAP_ALLOW_CONTROLS 标志,您对 SetThemeAppProperties 的调用会自动初始化 COM。但是,如果未设置该标志,则您必须自己做。

于 2011-03-11T12:16:28.937 回答