小编Hel*_*ein的帖子

WPF:标签导航打破了折叠的超链接

问题:使用TAB键导航在折叠的TextBlock/Hyperlink处停止.

再生产:

<Window x:Class="TabTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Width="200" Height="200">

    <Grid>
        <StackPanel Orientation="Vertical">
            <TextBox Text="before" />
            <TextBlock>
                <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </Style>
                </TextBlock.Style>
                <Hyperlink Focusable="False">
                    <TextBlock Text="test" />
                </Hyperlink>
            </TextBlock>
            <TextBox Text="after" />
        </StackPanel>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

如果你运行这个超级简单的演示并按TAB键,光标将移动到"之前"TextBox.再次按TAB确实......没有.光标停留在"之前"TextBox中,永远不会到达"之后"文本框.当Hyperlink的TextBlock可见时,导航按预期工作.

问题:如何在HyperLink折叠的情况下使TAB导航正常工作?

navigation keyboard wpf visibility hyperlink

7
推荐指数
1
解决办法
1601
查看次数

我应该用 emplace_back 替换所有对 push_back 的调用吗?

在我的 C++ 应用程序中,我大量使用 STL 容器,如vector. 有很多对 的调用push_back,我一直担心不必要的构造和复制操作。

我的应用程序非常低级,我非常关心 CPU 和内存使用情况。我应该将所有呼叫替换为push_back呼叫emplace_back吗?

我正在使用 Visual Studio 2013。

c++ stl visual-studio c++11

7
推荐指数
1
解决办法
1458
查看次数

C++:我应该捕获所有异常还是让程序崩溃?

我有一个用(Visual)C++编写的Windows服务,它具有非常详细的日志记录功能,经常帮助我找到客户有时遇到的错误原因.基本上我检查每个返回值并记录发生了什么以及错误来自哪里.

理想情况下,我希望对异常具有相同级别的详细可见性(例如,数组超出范围,除以零等).换句话说:我想知道异常的来源.出于可读性和实用性的原因,我不想将每几行代码包装到单独的try/catch块中.

我今天拥有的是一个通用的捕获所有捕获所有内容并在关闭程序之前记录错误.从用户的角度来看这很好 - 干净关闭而不是应用程序崩溃 - 但对我来说不好,因为我只从异常中获取一般信息(例如"数组超出范围"),但不知道它来自何处.

是不是更好的删除catch-all并让程序崩溃?我可以直接客户有Windows创建一个应用程序崩溃转储(如描述在这里).使用转储文件,WinDbg会指向我到代码中抛出异常的位置.

c++ windows crash minidump exception

6
推荐指数
1
解决办法
1020
查看次数

condition_variable :: wait_for()如何处理虚假的唤醒?

各种平台都允许虚假wakup.为了解决这个问题,我们在下面写出循环机制:

while(ContinueWaiting())
  cv.wait(lock);   // cv is a `std::conditional_variable` object
Run Code Online (Sandbox Code Playgroud)

同样的事情是可以理解的conditional_variable::wait_until().
但请看下面的例子:

const auto duration = Returns_10_seconds();
while(!Predicate())
  cv.wait_for(lock, duration);
Run Code Online (Sandbox Code Playgroud)

想象一下,虚假的唤醒发生在1秒钟.超时尚未达成.
它会再等10秒吗?这将导致无限循环,我相信不应该发生.从源代码,内部wait_for()调用wait_until().

我想了解,如何wait_for()处理虚假的唤醒?

c++ multithreading condition-variable c++11 spurious-wakeup

6
推荐指数
1
解决办法
3836
查看次数

Windows 资源监视器使用哪个 API?

Windows 资源监视器显示(除其他外)磁盘上的哪些文件当前由哪些进程访问。它实时执行此操作。如何?

我知道它可能使用 ETW,并且我可以使用 xperf 之类的工具生成跟踪。但是如何在无需启动、停止和解析跟踪文件的情况下获取实时信息呢?

我需要以编程方式访问数据,即从 C# 或 C++。

windows etw resource-monitor

5
推荐指数
1
解决办法
2836
查看次数

如何在PresentationFramework中调试NullReferenceException?

我的.NET 4应用程序使用WPF TreeView,我已经增强了它以启用键盘导航和延迟加载.我的问题是,很少会抛出下面显示的异常.在我开发的几个月里,这只发生过一次,我收到了一些客户的错误报告,这些客户偶尔会得到这个.这是非常罕见的,我无法改变一些东西,玩一下应用程序一段时间,并知道问题是否已经消失.

但我的主要问题是:堆栈跟踪只显示Microsoft代码,那里没有任何东西.这是.NET/WPF中的错误吗?有没有机会找到根本原因?

Type: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: PresentationFramework
Stack trace:    at System.Windows.Controls.ItemContainerGenerator.ContainerFromIndex(Int32 index)
  at System.Windows.Controls.TreeViewItem.FindNextFocusableItem(Boolean walkIntoSubtree)
  at System.Windows.Controls.TreeViewItem.InternalPredictFocus(FocusNavigationDirection direction)
  at System.Windows.Controls.VirtualizingStackPanel.FocusChanged(KeyboardFocusChangedEventArgs e)
  at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
  at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
  at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
  at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
  at System.Windows.Input.InputManager.ProcessStagingArea()
  at System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
  at System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
  at System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
  at System.Windows.UIElement.Focus()
  at System.Windows.Controls.TreeViewItem.OnItemsChanged(NotifyCollectionChangedEventArgs …
Run Code Online (Sandbox Code Playgroud)

.net wpf treeview exception nullreferenceexception

5
推荐指数
1
解决办法
2121
查看次数

在C++中比较两个GUID是否相等

我正在寻找最简单的方法来比较两个GUID在C++中的相等性.当然有一个预定义的功能.

该解决方案需要与Visual C++ 2010一起使用.

更新:

我在谈论Guiddef.h中定义的GUID:

typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;
Run Code Online (Sandbox Code Playgroud)

guid equality visual-c++

5
推荐指数
1
解决办法
1万
查看次数

如何将可变长度字符串从RPC服务器传递到客户端?

我正在用C++实现一个Windows系统服务,它充当RPC服务器和相应的客户端.我使用普通的Windows RPC功能.

将字符串从RPC客户端传递到服务器很容易.只需在IDL文件中声明函数参数,如下所示:

[in, string] wchar_t* myString
Run Code Online (Sandbox Code Playgroud)

MIDL将负责内存分配魔术.就像一种享受.

返回修改后的客户端字符串也很简单:

[in, out, string] wchar_t* myString
Run Code Online (Sandbox Code Playgroud)

但是,这要求我在客户端正确调整字符串的大小.

问题:

我需要将字符串从服务器返回给客户端.我不知道客户端会有多大,所以客户端的内存分配不是一种选择.

可以分配一个非常大的内存,比如10K,这个数量足够大,可以用于服务器可能返回的每个字符串.但这是对资源(内存,网络)的巨大浪费,我仍然无法确定服务器永远不需要返回更大的字符串.

我尝试了什么:

Amonst许多其他的东西我尝试了微软的strout示例中使用的技术.它在第一次调用RPC函数时起作用,但在第二次调用时崩溃了服务器.

c++ winapi rpc idl

4
推荐指数
1
解决办法
4695
查看次数

将COM事件暴露给VBScript(ATL)

我使用"ATL简单对象"向导在C++中使用ATL构建了一个COM服务器DLL.我关注了微软的ATLDLLCOMServer示例.一切都很好,除了一件事:我没有在VBScript中收到COM事件.我确实收到了C#中的事件.我在VBScript中使用早期基于MFC的实现中的事件作为ActiveX控件.

我的控件定义如下:

class ATL_NO_VTABLE CSetACLCOMServer :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSetACLCOMServer, &CLSID_SetACLCOMServer>,
    public IConnectionPointContainerImpl<CSetACLCOMServer>,
    public CProxy_ISetACLCOMServerEvents<CSetACLCOMServer>,
    public IDispatchImpl<ISetACLCOMServer, &IID_ISetACLCOMServer, &LIBID_SetACLCOMLibrary, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IProvideClassInfo2Impl<&CLSID_SetACLCOMServer, &DIID__ISetACLCOMServerEvents, &LIBID_SetACLCOMLibrary>   /* Required for event support in VBS */
{
public:

BEGIN_COM_MAP(CSetACLCOMServer)
    COM_INTERFACE_ENTRY(ISetACLCOMServer)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
   COM_INTERFACE_ENTRY(IProvideClassInfo)
   COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()

BEGIN_CONNECTION_POINT_MAP(CSetACLCOMServer)
    CONNECTION_POINT_ENTRY(__uuidof(_ISetACLCOMServerEvents))
END_CONNECTION_POINT_MAP()

[...]
Run Code Online (Sandbox Code Playgroud)

在VBScript中我使用COM对象,如下所示:

set objSetACL = WScript.CreateObject("SetACL.SetACL", "SetACL_")

' Catch and print messages from the SetACL COM server which are passed (fired) as events.
' The name postfix …
Run Code Online (Sandbox Code Playgroud)

c++ com vbscript events atl

4
推荐指数
1
解决办法
2787
查看次数

IDispatch错误和/或消息文本列表

我在WMI/WBEM接口上调用返回HRESULTS的方法.我想向用户显示这些错误代码的有意义的错误消息.但是,当我查找HRESULT的错误消息时,我只得到类似"IDispatch错误#3598"的字符串.

我可以找到这些IDispatch错误代码的列表来解释它们的含义吗?

可能发生错误的示例代码:

IWbemLocator *pLocator = NULL;
IWbemServices *pNamespace = NULL;
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLocator);
if (FAILED(hr))
   return hr;

hr = pLocator->ConnectServer(wPath, NULL, NULL, NULL, 0, NULL, NULL, &pNamespace);
if(FAILED(hr))
   return hr;
Run Code Online (Sandbox Code Playgroud)

错误查找:

CString sMessage = _com_error(nError).ErrorMessage();

// sMessage now contains a string like "IDispatch error #3598"
Run Code Online (Sandbox Code Playgroud)

注意:没有帮助 - 它不包含我得到的HRESULTS.它们都不包含在winerror.h中.

c++ com idispatch

3
推荐指数
1
解决办法
6944
查看次数