Articles of c + +

在Windows上修改堆栈,TIB和exception

我的问题的由来源于想要提供在Windows上支持用户提供堆栈的pthreads的实现。 具体来说, pthread_attr_setstack应该做一些有意义的事情。 我的实际需求比这个多一点,但是这对于这个post来说足够好了。 没有用于在光纤或线程API中提供堆栈的公共Win API。 我search了偷偷摸摸的后门,解决方法和黑客,没有任何进展。 实际上,我看到了winpthread源代码的灵感,忽略了任何提供给pthread_attr_setstack堆栈。 相反,我尝试了下面的“解决scheme”,看看它是否会工作。 我使用ConvertThreadToFiber , CreateFiberEx和SwitchToFiber的常用组合创build一个光纤。 在CreateFiberEx我提供了最小的堆栈大小。 在光纤的入口点,然后为堆栈分配内存,相应地更改TIB字段:“Stack Base”和“Stack Limit”(请参见http://en.wikipedia.org/wiki/Win32_Thread_Information_Block ),然后设置ESP到我的堆栈的高地址。 (在现实世界的情况下,我会设置堆栈比这更好,并改变EIP,以便这一步的行为更像POSIXfunction的swapcontext ,但你明白了)。 如果我在这个不同的堆栈上做任何操作系统调用,那么我几乎搞砸了(例如printf死亡)。 然而,这对我来说不是问题。 我可以确保我在自定义堆栈上从不确定调用(因此为什么我说我的实际需求有一点涉及)。 除了…我需要例外的工作。 而他们不! 具体来说,如果我尝试抛出并捕获exception,我修改的堆栈,然后我得到一个断言 未处理的exception在0xXXXXXXXX …. 所以我的(模糊)问题是,有没有人有任何洞察力,如何exception和自定义堆栈可能不是很好地一起玩? 我明白,这是完全不受支持的,除了零响应或“走开”以外,可以愉快地开展工作。 事实上,我已经决定了,我需要一个不同的解决scheme,尽pipe这涉及妥协,我可能会使用一个。 然而,好奇心越来越好,所以我想知道为什么这不起作用。 在一个相关的笔记,我想知道Cygwin如何处理这个ucontext。 源代码http://szupervigyor.ddsi.hu/source/in/openjdk-6-6b18-1.8.13/cacao-0.99.4/src/vm/jit/i386/cygwin/ucontext.c使用GetThreadContext / SetThreadContext实施ucontext。 但是,从实验中我看到,当从新的上下文中抛出exception时,这也失败了。 实际上, SetThreadContext调用甚至不更新TIB块! 编辑(根据@avakar的答案) 下面的代码与您的代码非常相似,performance出同样的错误。 不同的是,我不启动第二个线程暂停,但暂停它,然后尝试更改上下文。 这段代码展示了我在描述try-catch块在foo 。 也许这根本不合法。 值得注意的是,在这种情况下,当modifyThreadContext时,TIB的ExceptionList成员是一个有效的指针,而在你的例子中它是-1。 手动编辑这没有帮助。 正如我对你的回答评论所述。 这不是我所需要的。 我想从我目前的线程切换上下文。 但是, SetThreadContext的文档警告不要在活动线程上调用它。 所以我猜如果下面的代码不起作用,那么我没有机会使它在单个线程上工作。 namespace { HANDLE […]

SDL导致CEF3产生额外的窗口

我试图让CEF3(Chromium Embedded Framework: https ://bitbucket.org/chromiumembedded/cef)与SDL(Simple DirectMedia Layer: https ://www.libsdl.org/)一起工作。 我对这两个库的使用意图是使用SDL打开一个窗口,从中接收事件并渲染OpenGLgraphics(与其他库(如GLEW)结合使用)。 我想使用CEF3为用户界面提供graphics元素,然后通过OpenGL纹理将其显示在屏幕上。 所有这些工作,我可以打开SDL窗口,处理事件,我可以绘制OpenGL纹理,并从CEF3中的屏幕渲染获得OpenGL兼容的数据。 问题是,如果我在testing环境中一起运行SDL和CEF3,CEF3会产生多个附加窗口。 这是我用于CEF3的代码。 void Example::webTest() { //Args CefMainArgs cefArgs; //Settings CefSettings cefSettings; cefSettings.pack_loading_disabled = true; cefSettings.windowless_rendering_enabled = true; //Initialize CefInitialize(cefArgs, cefSettings, nullptr, nullptr); //Render Handler renderHandler = new InterfaceRenderHandler(); //Window Info CefWindowInfo cefWindowInfo; //cefWindowInfo.SetAsWindowless(0, true); cefWindowInfo.windowless_rendering_enabled = true; cefWindowInfo.transparent_painting_enabled = true; //Interface Browser CefRefPtr<InterfaceBrowserClient> […]

如何在阅读视图中打开Web视图? UWP

我有一个FeedReader应用程序,我希望我的页面在阅读视图(IE 11,EDGEfunction)中打开。例如,Windows 10中的新闻应用程序使用此function,所有新闻描述都在阅读视图中。 可能吗 ? 阅读视图示例(屏幕截图): https://social.msdn.microsoft.com/Forums/getfile/733596 新闻应用阅读视图示例(截图): https://social.msdn.microsoft.com/Forums/getfile/733599 提前致谢 。

删除ListView项目上的button

我开始为UWP开发。 我试图创build一个ListView填充x:bind 。 现在我想在所有单个项目上创build一个button来删除它们。 像Windows 10邮件: 我创造了这个: <ListView x:Name="listActivity" ItemsSource="{x:Bind list}" Grid.Column="0" Header="Activity List" HorizontalAlignment="Center" Width="auto" IsItemClickEnabled="True" ItemClick="showDel"> <ListView.ItemTemplate> <DataTemplate x:DataType="vm:Activity"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="3*"/> <ColumnDefinition Width="1*"/> </Grid.ColumnDefinitions> <TextBlock x:Name="txt" Text="{x:Bind name}" Grid.Column="0"/> <Button x:Name="delItem" Click="delActivity" Grid.Column="1" Visibility="Collapsed" Background="Transparent" Margin="100, 0, 0, 0"> <SymbolIcon Symbol="Delete"/> </Button> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> 我想改变delItembutton的visibility ,但是从C#我不能使用set Name来调用它。 我怎么能做到这一点?

Windows服务产生的进程比GUI产生的进程慢3至4倍

我用Borland C ++编写了一个服务应用程序。 它工作正常。 在ServiceStart(TService * Sender,bool&Started)例程中,我调用mjwinrun来启动一个进程来处理macros。 这个过程没有用户界面,任何错误logging到一个文件。 它将继续运行,直到服务器重新启动,closures或使用任务pipe理器终止进程。 这是mjwinrun: – int mjwinrun(AnsiString cmd) { STARTUPINFO mjstupinf; PROCESS_INFORMATION mjprcinf; memset(&mjstupinf,0,sizeof(STARTUPINFO)); mjstupinf.cb=sizeof(STARTUPINFO); if (!CreateProcess(NULL,cmd.c_str(),NULL,NULL,TRUE,0,NULL,GetCurrentDir().c_str(),&mjstupinf,&mjprcinf)) { LogMessage("Could not launch "+cmd); return -1; } CloseHandle(mjprcinf.hThread); CloseHandle(mjprcinf.hProcess); return mjprcinf.dwProcessId; } cmd是启动macros队列处理器的命令行。 我使用了一个CPU /内存密集型的macros,并将它的时序写入文件。 这是我发现的: 1)如果在login会话中从命令行启动macros处理器,则无论运行的是哪个Windows核心,macros都将在6秒内完成。 2)如果macros处理器是从Vista核心或更低版本(使用上面的mjwinrun)启动的服务启动的,则macros在6秒内完成。 3)如果macros处理器是从在Windows 7内核或更高版本上启动的服务(使用上面的mjwinrun)启动的,则macros将在超过18秒内完成。 我已经尝试了CreateProcess的所有不同的标志,没有一个有所作为。 我已经尝试了所有不同的服务帐户,这没有任何区别。 我尝试设置任务,I / O和Page的各种优先级,但都没有区别。 就好像这个服务的产生的进程在某种程度上受到了限制,而不是以I / O方式,而是在CPU /内存使用方面。 任何想法在Windows 7以后发生了什么变化?

USB编程与Windows

我想写一个程序来处理我的USB端口(Windows)。我不知道该怎么说,但这是它应该如何工作。该程序应该运行(这应该是第一件事情[病毒警卫之前询问是否这个闪存驱动器应该扫描])当一个闪存驱动器或外部硬盘驱动器插入到一个USB端口。 我不是在谈论汽车运行,我该怎么做。

C#中的variablesID

在编写Windows Forms应用程序时,我发现自己必须根据input的数量创build可变数量的文本字段。 我决定命名这些name1 , name2 , name3 ,…, nameN 。 现在我想能够将用户的input保存到文本文件。 要做到这一点,我需要从文本框中的文本到单独的variables,以便能够将其写入文本文件。 这将导致这样的for循环: for(i=0; i < totalnames; i++) { string varname= "name" + i; } 但是这样我就无法从文本框中获得价值。 如何从文本框中获取单独的值以将其写入文本文件? 谢谢,

为什么在OnClick之前调用Click,我该如何解决?

我有一个自定义button( public partial class QButton : Control )具有以下代码来更改自己的已检查状态,当用户单击它: protected override void OnMouseClick(MouseEventArgs e) { if (e.Button != System.Windows.Forms.MouseButtons.Left) { base.OnMouseClick(e); return; } Status tmp = m_status; if (m_status.HasFlag(Status.Checked)) m_status &= ~Status.Checked; else m_status |= Status.Checked; if (tmp != m_status) Invalidate(); base.OnMouseClick(e); } 那部分工作正常。 在表单中使用这个button时,我将这样的事件连接起来: public void attach(Control.ControlCollection c) { /* … */ m_Button.Click += OnEnable; […]

OpenCVSharp:无法加载DLL“OpenCvSharpExtern”

我在我的项目中安装了最新的OpenCVSharp 2(2.4.10.201 …)和NuGetpipe理器。 关于OpenCVSharp.CvMat的一切工作正常(加载,操作等),所以我相信安装是正确的。 但是我根本无法使用OpenCVSharp.CPlusPlus! 问题是它不会加载OpenCvSharpExtern.dll。 从try-catch块显示错误: try { Mat mat = new Mat(); } catch (Exception err) { Console.WriteLine( err ); } System.TypeInitializationException: The type initializer for 'OpenCvSharp.CPlusPlus.Mat' threw an exception. —> System.DllNotFoundException: Unable to load DLL 'OpenCvSharpExtern': The specified module could not be found. (Exception from HRESULT: 0x8007007E) at OpenCvSharp.CPlusPlus.NativeMethods.core_Mat_sizeof() at OpenCvSharp.CPlusPlus.Mat..cctor() — […]

传递字节的SAFEARRAY以加载MSXML的函数

如果有任何一种灵魂在那里请通过以下来源,告诉我为什么MSXML“加载”function无法加载这个XML。 在这里我试图加载一个UTF-8编码的XML使用MSXML分析器的“加载”function。 我有一个BSTR [UTF-16编码]作为参数,所以我试图将它转换成字节的SAFEARRAY,以便我可以将它传递到MSXML的“加载”function。 但问题是加载函数无法加载这个XML。 如果有人能提供解决scheme,我将非常感激。 #include <windows.h> #include <objsafe.h> #include <objbase.h> #include <atlbase.h> #include <string> #include <comutil.h> #include <msxml2.h> #include <iostream> using namespace std; #define STATUS_SUCCESS 0 #define STATUS_FAIL -1 long LoadXmlData(BSTR xmlDoc) { HRESULT hr = S_OK; CComPtr <IXMLDOMDocument> xmlDomDoc = NULL; CComPtr <IXMLDOMElement> docRoot = NULL; VARIANT_BOOL isParseSucess = FALSE; CoInitialize(NULL); hr […]