我有一个用C#编写的.NET4Windows服务,运行在WindowsServer2008上,当使用PerfMon监控时,它似乎每小时消耗2,500个句柄。“处理数”计数器一直向上攀升。当我使用选中“显示未命名句柄和映射”选项的ProcExp查看句柄时,列出了数以千计的事件和信号量句柄。大多数似乎没有名字。我查看了源代码,没有明确使用AutoResetEvent或ManualResetEvent。PrivateBytes计数器上升和下降。我已经有两个多小时没看过这个过程了,但会在一夜之间对其进行监控。该服务在远程服务器上运行,因此我无法直接附加调试器,并且可能必须转储进程并使用WinD
进程ID是唯一标识进程的数字。进程句柄也是一个唯一标识进程内核对象的数字。为什么我们需要它们,因为它们中的任何一个都可以标识一个过程。我想答案可能在于进程与进程内核对象之间的映射关系。多个进程内核对象是否可以映射到一个进程?并且每个进程内核对象都有自己的进程句柄。这样每个进程内核对象都可以代表不同的访问模式或类似的东西。当我使用MiniDumpWriteDump()时,我想到了这个问题。函数,声明如下:BOOLWINAPIMiniDumpWriteDump(__inHANDLEhProcess,__inDWORDProcessId,__inHANDLEhFile,__inMINIDUM
在python中,我通过EnumWindows枚举顶层窗口,也通过EnumProcesses枚举进程。然后在python脚本中,我将属于同一pid的所有窗口句柄放入一个列表中(我通过GetWindowThreadProcessId完成了此操作)。后来我发现了一件事:notepad.exe有3个窗口句柄,但我只打开了一个文本文件。为什么?此外,我尝试通过SetForegroundWindow将文本窗口设置为前景窗口,我将三个窗口句柄传递给该函数,两个工作。这怎么可能? 最佳答案 进程有时会出于自己的目的创建不可见的窗口。您应该忽略它们
我想从Delphi启动一个应用程序,并获得它的句柄,这样我就可以将所述应用程序的主窗口嵌入到TFrame类型的框架中。到目前为止我已经尝试过:FunctionTFrmEmbeddedExe.StartNewApplication:Boolean;varSEInfo:TShellExecuteInfo;ExitCode:DWORD;beginFillChar(SEInfo,SizeOf(SEInfo),0);SEInfo.cbSize:=SizeOf(TShellExecuteInfo);withSEInfodobeginfMask:=SEE_MASK_NOCLOSEPROCESS;Wn
我正在尝试窥探应用程序正在写入的日志文件。我已经成功地将createfile与MSR的detours库Hook,但createfile似乎从未被我有兴趣窥探的文件调用。我也尝试过使用相同的结果Hookopenfile。我不是经验丰富的Windows/C++程序员,所以我最初的两个想法是应用程序在我挂接api之前调用createfile,或者有一些其他API可以为它们创建文件/获取句柄。 最佳答案 您可以使用Sysinternal的FileMon.它是一个出色的监视器,可以准确地告诉您正在执行哪些与文件相关的系统调用做了什么,参数是什
我实现了一个self升级过程,其中我的主应用程序exe启动了一个更新程序exe,在命令行上将句柄传递给自身。然后应用程序exe调用ExitProcess退出,更新程序在传入的句柄上调用WaitForSingleObject以等待应用程序exe终止。WaitForSingleObject会等待。在应用程序调用ExitProcess之前,更新程序会停止。但是,有时,当更新程序试图用新版本覆盖应用程序dll时,我会收到一个文件锁定错误,我的更新程序的当前版本将其视为不可恢复的错误并终止。似乎包含一个任意的sleep(100)就足以绕过这个“问题”,但我真的很讨厌这样的代码。真的很讨厌。我觉得
当使用WindowsAPI在C++中创建子进程时,可以允许从父进程到子进程的句柄继承。在Microsoft示例中"CreatingaChildProcesswithRedirectedInputandOutput",将子进程的标准输入/输出重定向到父进程创建的管道,必须允许继承才能使用重定向管道。我正在开发一个小型演示类,它启动一个外部可执行文件,读取输出,然后将其返回给调用者(调用者将返回的输出记录到一个文件中)。我正在尝试构建一个超时功能,它只会在对child调用TerminateProcess()并继续生活之前阻塞一定的时间。但是,我发现通过允许句柄继承,子进程也有输出文件的句柄
我们创建一个文件用作内存映射文件。我们用GENERIC_READ|打开GENERIC_WRITE我们使用与FILE_SHARE_READ|共享文件共享写入|FILE_SHARE_DELETE我们使用文件属性FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE我们成功创建了文件。我们可以根据需要使用相同的标志重新打开它多次。一旦一个句柄被关闭,我们就不能再打开更多的句柄,它返回ERROR_ACCESS_DENIED。我们可以通过关闭任何句柄来引起这种情况,第一个来自CreateFile(ALWAYS_CREATE),或者其他来自Create
为仅按值传递的句柄编写包装类相对容易。我正在尝试确定封装需要通过地址传递的句柄的最佳方法。例如,为像SC_HANDLE这样的东西编写一个包装器,它通过值传递给QueryServiceConfig()并不难。可以实现一个成员函数,如.GetHandle()或实现operator()。问题(至少对我而言)是像RegOpenKeyEx()这样的API函数需要HKEY的地址。我读到重载运算符&通常不是一个好主意。在允许API函数访问的同时保持封装(或尽可能多的封装)特别是资源收集的推荐方法是什么? 最佳答案 你总是可以添加另一层间接层来避免
我正在从事一个设计不寻常的特殊项目。在我的应用程序/进程中,我将创建一个子进程来做一些工作。在我的流程中,我需要从子流程中获得反馈。我想将我的应用程序/进程的Windows句柄传递给这个子进程,所以我从这个子进程发布消息。如何将窗口句柄传递给子进程?我的子进程是一个命令行应用程序,没有WindowUI,主要功能如下:intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)我应该将窗口句柄传递给主函数吗?怎么办?谢谢 最佳答案