Articles of c + +

(C,windows)上的vista和UAC的CreateDesktop()

我在Vista中使用Vista UAC(C Windows)在CreateDesktop()中提出这个问题。我设置了一个赏金,但是在尝试拒绝唯一的答案时,错误地按下了“接受”(我已经醒了超过48小时)。 所以我再问一遍。 我正在使用CreateDesktop()创build一个应用程序将运行的临时桌面,执行清理操作(同时保持原状)并终止。 一旦应用程序消失,我正在closures桌面。 使用Windows XP甚至Vista时,一切都很好。 当启用(令人讨厌的)UAC时,问题就出现了。 当您创build桌面时,一切正常,但是当您调用CreateProcess()在该桌面上打开程序时,它会导致打开的应用程序崩溃,同时在User32.dll上发生exception。 我一直在阅读很多有关Windows上不同的桌面和图层以及内存的限制。 但是,我打开的大多数程序(作为testing场景)都可以,但是一些(如IE,记事本,Calc和我自己的应用程序)会导致崩溃。 任何人都有任何想法为什么这种情况发生在UAC的Vista上,或者更具体地说,这些特定的程序? 以及如何解决这个问题? 任何人都有一个很好的例子,如何创build一个桌面,并打开一个应用程序没有切换到Vista下与UAC? 代码表示赞赏。 谢谢 使用的代码是 SECURITY_ATTRIBUTES sa; HDESK dOld; HDESK dNew; BOOL switchdesk, switchdesk2, closedesk; int AppPid; sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); //Get handle to current desktop dOld = OpenDesktopA("default", 0, TRUE, DESKTOP_SWITCHDESKTOP| DESKTOP_WRITEOBJECTS| DESKTOP_READOBJECTS| DESKTOP_ENUMERATE| DESKTOP_CREATEWINDOW| DESKTOP_CREATEMENU); […]

获取当前用户的最后一次login

我正在尝试获取当前的用户上次login。 我可能是这届本届会议,也可能是之前的会议。 我打电话GetUserName()获取当前的用户名。 我将其馈送到NetUserGetInfo()中以尝试获取上次login时间。 这一切都失败,错误2221(用户未find)。 当我用“pipe理员”尝试它的作品。 即使我硬编码我的用户名,它会返回一个2221.这就是我正在使用的: nStatus = NetUserGetInfo(NULL, L"administrator", dwLevel, (LPBYTE *) & pBuf); 你怎么能得到当前用户的最后login时间? 谢谢,代码总是欢迎。 这是我目前使用的完整代码: DWORD dwLevel = 2; NET_API_STATUS nStatus; LPTSTR sStringSid = NULL; LPUSER_INFO_0 pBuf = NULL; LPUSER_INFO_2 pBuf2 = NULL; WCHAR UserName[256]; DWORD nUserName = sizeof(UserName); if(GetUserName(UserName, &nUserName)) { printf("information for %ls\n", UserName); nStatus = NetUserGetInfo(NULL, UserName, dwLevel, […]

使用清单的DLLredirect

我需要可靠地redirect应用程序查找特定的DLL。 使用app.exe.local方法不起作用,因为如果应用程序具有清单(embedded文件或单独文件),则会忽略本地文件。 所以我正在试图通过在清单中将DLL定义为私有程序集来执行DLLredirect。 我有一个testing应用程序,只需调用LoadDll.exe LoadLibrary("C:\\EmptyDll.dll"); LoadDll.exe具有清单(作为单独的文件,LoadDll.exe.manifest) <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.1" processorArchitecture="x86" name="LoadDll" type="win32" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="EmptyDll" version="1.0.0.1" processorArchitecture="x86" /> </dependentAssembly> </dependency> </assembly> 包含LoadDll.exe(NOT c:\)的Application文件夹包含带有embedded式清单的EmptyDll.dll。 <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <assemblyIdentity type="win32" name="EmptyDll" version="1.0.0.1" processorArchitecture="x86" /> </assembly> 但是,LoadDll.exe继续并加载C:\ EmptyDll.dll,而不是应用程序文件夹中的EmptyDll.dll。 如果您破坏了任何清单(例如,在EmptyDll.dll清单标识中更改版本号),则LoadDll.exe不会加载,因此清单文件正在被Windows读取和处理,但只是被忽略。 任何人有任何想法? 谢谢! 托比

当QueryPerformanceCounter被调用时会发生什么?

我正在研究在我们的系统中使用QueryPerformanceCounter的确切含义,并试图了解它对应用程序的影响。 我可以看到在我的4核单CPU机器上运行它需要大约230ns运行。 当我运行在24核心4 CPU的Xeon它需要大约1.4ms运行。 在我的机器上运行multithreading时更有趣,它们不会互相影响。 但是在多CPU机器上,线程会导致某种交互,导致它们互相阻塞。 我想知道是否有总线上的一些共享资源,他们都查询? 当我调用QueryPerformanceCounter时究竟发生了什么,它真正衡量的是什么?

如何在C ++中获取进程的起始/基地址?

我正在微软的蜘蛛纸牌上使用它testing整个基地/静态指针的东西。 所以我得到了玩家使用的“移动”量的基本指针,而欺骗引擎告诉我这是“SpiderSolitaire.exe + B5F78”。 所以现在我被困在如何确定SpiderSolitaire.exe的起始地址是什么(当然每次程序启动时都会改变)。 我如何findSpiderSolitaire.exe的起始地址,所以我可以添加偏移量,并得到“移动”值的真实地址(当然在c + +)?

“Microsoft.ACE.OLEDB.12.0”提供程序未在64位机器的本地计算机上注册

我在Windows应用程序中工作。 我正在从Excel中读取值并更新到数据库中。 我的代码是 string Con_Str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";"; 它在我的本地工作很好,我有32位机器。 我运行在64位的机器的服务器的exe文件。 在那里我得到了这样的错误 The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. 我已经从这个链接下载最新的.. http://www.microsoft.com/en-us/download/details.aspx?id=13255 我仍然得到这个问题。 如何解决这个问题

目录的大小

有没有办法获得目录大小/文件夹的大小,而不实际遍历此目录,并增加每个文件的大小? 理想的情况是想使用一些类似boost的库,但win api也可以。

C和C ++结构之间的区别

我试图将C ++结构转换为C,但不断得到“未声明的标识符”? C ++是否有不同的语法来引用结构? struct KEY_STATE { bool kSHIFT; //if the shift key is pressed bool kCAPSLOCK; //if the caps lock key is pressed down bool kCTRL; //if the control key is pressed down bool kALT; //if the alt key is pressed down }; 我在另一个结构中使用KEY_STATEtypes的variables: typedef struct _DEVICE_EXTENSION { WDFDEVICE WdfDevice; KEY_STATE kState; } DEVICE_EXTENSION, […]

我如何在Windows中创build一个线程安全的单例模式?

我一直在阅读有关线程安全的单例模式: http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B_.28using_pthreads.29 它在底部说,唯一安全的方法是使用pthread_once – 这在Windows上不可用。 这是保证线程安全初始化的唯一方法吗? 我已经读过这个线程: 用C ++线程安全地构build一个单例 而且似乎暗示了一个primefaces操作系统级别的交换和比较函数,我在Windows上假设的是: http://msdn.microsoft.com/en-us/library/ms683568.aspx 这可以做我想要的吗? 编辑:我想懒惰的初始化,并为此只有一个类的实例。 在另一个网站上有人提到在命名空间内使用全局(他将单例描述为反模式) – 它怎么可能是一个“反模式”? 一般承认的答案: 我已经接受Josh的答案,因为我正在使用Visual Studio 2008 – NB:对于未来的读者,如果你不使用这个编译器(或2005) – 不要使用接受的答案! 编辑: 代码工作正常,除了返回语句 – 我得到一个错误:错误C2440:'返回':不能从'易变的单身*'转换为'单身人士*'。 我应该修改返回值是易变的Singleton *? 编辑:显然const_cast <>将删除挥发性限定符。 再次感谢乔希。

Thread.Sleep(0):什么是正常的行为?

为了理解Thread.Sleep(0)在OS上强制上下文切换。 我想查看在接收一些CPU时间之前可以传递给应用程序的最大时间。 所以我构build了一个在while循环(c#)中执行Thread.Sleep(0)的应用程序,并计算每次调用之间传递的时间。 当这个应用程序是唯一在双核心testingPC上运行的应用程序时,最大观察时间正好在1毫秒(平均为0.9微秒),它使用所有可用的CPU(100%)。 当我沿着CPU填充虚拟应用程序(全部具有相同的优先级)运行它时,最大时间约为25ms,平均时间为20ms。 它的行为完全如我所料。 时间非常稳定。 每当CPU获得一些CPU时间时,立即将控制权交还给需要处理的人,这就像热土豆游戏(CPU使用率下降到0%)。 如果没有其他应用程序正在运行,则控件立即返回。 鉴于此行为,我预计此应用程序对运行实际应用程序的计算机具有最小的影响。 (并给我实际的“延迟”,我期望看到在那里运行的应用程序)。 但令我惊讶的是,这确实影响了(以可观察的方式)这个特定系统的performance。 我是否错过了有关Thread.Sleep(0)的一些重要观点? 作为参考这里是这个应用程序的代码 private bool _running = true; private readonly Stopwatch _timer = new Stopwatch(); private double _maxTime; private long _count; private double _average; private double _current; public Form1() { InitializeComponent(); Thread t = new Thread(Run); t.Start(); } public void Run() { while(_running) { […]