Articles of c + +

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 […]

MFC:在ON_COMMAND函数混淆?

好吧,这是这个function 。 。 ON_COMMAND(ID_COLOR_RED,OnColor) ON_COMMAND(ID_COLOR_GREEN,OnColor) ON_COMMAND(ID_COLOR_BLUE,OnColor) 。 。 。 无效CMainWindow :: OnColor() { UINT nID =(UINT)LOWORD(GetCurrentMessage() – > wParam); m_nCurrentColor = nID _ ID_COLOR_RED; } 因此,在这里,CurrentMessage的wParam的LOWORD应该包含消息的ID,没关系,但是m_nCurrentColor = nID _ ID_COLOR_RED是什么意思; 手段? 对于红色,绿色或蓝色,m_nCurrentColor可以分别为0,1或2 … 所以首先我们在第一个语句中将消息ID转换为UINT,但是我们在第二个函数中使用m_nCurrentColor = nID _ID_COLOR_RED来做什么? 谁能解释一下吗?

在TCP Telnet传输中丢失字符

我正在使用Winsock通过Telnet发送命令; 但由于某种原因,当我尝试发送一个string时,偶尔会有几个字符丢失。 我用send : int SendData(const string & text) { send(hSocket,text.c_str(),static_cast<int>(text.size()),0); Sleep(100); send(hSocket,"\r",1,0); Sleep(100); return 0; } 有什么build议么? 更新: 我检查了,即使所有的字符被发送,错误仍然发生。 所以我决定改变Sendfunction,以便发送单个字符并检查是否已经发送: void SafeSend(const string &text) { char char_text[1]; for(size_t i = 0; i <text.size(); ++i) { char_text[0] = text[i]; while(send(hSocket,char_text,1,0) != 1); } } 而且,它以一种特殊的方式来放置字符; 即在句子的中间。 例如 set variable [fp]exit_flag = true 被发送为 ariable [fp]exit_flag […]

在使用WinCrypt证书进行身份validation的Windows上创buildSSL套接字?

validationSSL客户端连接时,服务器期望客户端提供证书。 在典型的企业Windows平台上,这些证书位于Windowsencryption存储的“个人”部分(使用此命令打开:'certmgr.msc') OpenSSL不使用这些证书。 Windows确实提供了一个WinHTTP API,它提供了创buildSSL连接的能力,但是他们必须遵守HTTP请求/响应协议,是否有人知道Windows API允许程序员创build使用Windowsencryption存储证书进行身份validation的SSL连接,但是可以像OpenSSL套接字一样使用?谢谢。

64位窗口 – 我需要使用IMAGE_NT_HEADERS64?

我试图读取Windows 64环境中的一些进程的PE头,因为我的代码只是读取IMAGE_NT_HEADERS结构的32位和64位可执行文件,我想知道:我需要写一些像 if executable is 64 bit use IMAGE_NT_HEADERS64 else use IMAGE_NT_HEADERS ? 我的代码似乎只使用IMAGE_NT_HEADERS 64和32位进程工作,我错过了什么?