问题标签 [handles]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
67919 浏览

.net - "Error Creating Window Handle"

We're working on a very large .NET WinForms composite application - not CAB, but a similar home grown framework. We're running in a Citrix and RDP environment running on Windows Server 2003.

We're starting to run into random and difficult to reproduct "Error creating window handle" error that seems to be an old fashion handle leak in our application. We're making heavy use of 3rd Party controls (Janus GridEX, Infralution VirtualTree, and .NET Magic docking) and we do a lot of dynamic loading and rendering of content based on metadata in our database.

There's a lot of info on Google about this error, but not a lot of solid guidance about how to avoid issues in this area.

Does the stackoverflow community have any good guidance for me for building handle-friendly winforms apps?

0 投票
4 回答
2171 浏览

.net - 如何找到我的 .Net 应用程序泄漏 Windows 句柄的位置?

我有一个 WinForms .Net 应用程序,它可以运行大量 XPS 文档(数千个),在此运行期间,每个文档的句柄数量(根据 sysinternals 进程监视器和任务管理器)增加了 3-10 个。我严重怀疑这些是由 MS .Net XPS 框架库打开而不是关闭的句柄,但我无法追踪它。

尽管单步执行代码,但在同一运行期间,句柄计数在不同点会增加。例如,一次通过循环,句柄计数将在一行上跳 1,下一次可能不会跳,或者它可能跳 2。所以我怀疑 XPS com 组件有句柄泄漏。

虽然内存使用很好,但如果我一直像这样耗尽句柄,那么我会崩溃应用程序,也许是桌面。

到目前为止,我已经尝试过 sysinternals 进程资源管理器来查看句柄,但它们都被标记为没有更多细节。还使用了来自 sysinternals 的 handle.exe,这并没有显示快照之前、期间和之后的任何显着差异。

关于如何追踪把手的去向的任何线索?我想我将不得不简化为一个单线程控制台应用程序来测试。

问候

瑞安

0 投票
2 回答
431 浏览

c# - 带有图标的 GDI 句柄。l

我有一个winforms 应用程序。我有一个带有很多图标的用户控件。用户可以在表单上多次加载此控件(在选项卡式布局中)。现在我每次创建控件时都在加载图标(在应用程序中可能高达 50 次)。有没有办法在应用程序中缓存这些图标。如果我这样做,会减少我正在使用的 gdi 句柄的数量,因为这已成为一个问题。

0 投票
2 回答
362 浏览

c++ - 你怎么能打破句柄创建?

我有一个产生多个子进程的应用程序。在启动子程序之前,我为日志文件创建 stdOut 和 stdErr 句柄(例如,如果我要启动 procA,我创建 logA.log 的句柄)。我在子进程上设置了这些句柄。

通过查看 ProcExplorer,我可以看到每个子进程都有每个日志文件的句柄(因此 procA 有 logA、logB 等的句柄)。这会产生以后的问题。

我希望能够看到 procA 何时创建 logB 的句柄。有什么想法吗?

0 投票
3 回答
30347 浏览

windows - 如何枚举进程的句柄?

有什么方法可以在windows中枚举给定PID的进程,并获取他所有打开的句柄(锁定文件等)的列表?

编辑:我不在乎语言。如果它在 .NET 中,我会很高兴,如果在 WinApi (C) 中,它不会受到伤害。如果在别的地方,我想我可以重写它:-)

0 投票
1 回答
13407 浏览

c# - 将“句柄”从 VB.NET 迁移到 C#

我正在将一些代码从 VB.NET 迁移到 C# (3.5)。

我发现如下结构:

将这种行为转换为 C# 的最直接方法是什么?

0 投票
1 回答
646 浏览

c++ - 是否有与 RPC 上下文句柄等效的 WCF?

我正在更新旧的 C++ 服务以使用 WCF 而不是 RPC,并且在发送和接收句柄(HANDLE、void*..etc)时使用什么类型存在问题。在更新的服务中,我目前使用 IntPtr,但这在从 64 位版本的服务转换为 32 位版本时不起作用。IntPtr 不能反序列化,因为在内部它只是一个 void* ,这将根据您在哪个环境中运行而有所不同。

这解决了问题,因为 RPC 基础结构实际上从不发送句柄值,而是引用句柄的 GUID。此过程在以下文章中进行了描述:

请参阅上下文句柄部分

我正在寻找与此功能等效的 WCF。我可以自己在服务上编写类似的逻辑来执行此操作,甚至只是将 IntPtr 更改为 Int64,但我希望有类似于 RPC 方式的东西。

0 投票
2 回答
1907 浏览

c# - 查找进程使用的 USER 对象的数量

我正在调查可能导致我的 .NET 2.0 WinForms 应用程序中出现“创建窗口句柄时出错”Win32Exception 的内存泄漏。这与句柄的数量和用户对象的数量(很可能)有关,所以我试图在下次抛出异常时记录这些指标。

HandleCount 很容易找到: Process.HandleCount.

有谁知道如何找到用户对象的数量?(值可以在Task Manager->Processes的一栏中看到).NET或win API函数都可以。

谢谢!

0 投票
1 回答
1461 浏览

c# - 如何更改应用程序外部窗体的窗口样式?

如何在您的应用程序之外更改窗体的窗口样式?难题?
我实际上是想移动一个表格,女巫是最上面的,没有边界。
我有窗口的句柄(hWnd)。
如果保证可以工作,我可以编写数千行代码。

0 投票
5 回答
345 浏览

delphi - 被释放的句柄以某种方式损坏?

奇怪的问题。也许有人可以提供一些见解。

  • 情景 1。我在内存中有一个 TBitmap,它在进行复杂计算以计算每个像素的颜色时被写入。每隔一段时间(通常在填充位图的每条水平线之后)TBitmap 被绘制到表单上的图像(image1.Canvas.Draw(0, 0, TBitmap)。大多数时候这工作正常,但我注意到如果每条位图线有许多缓慢的复杂计算(比如计算时间超过 30 秒或一分钟),那么主窗体会有一个瞬间“闪烁”,以某种方式擦除位图,所以 image.draw 调用只绘制最新计算的行和前 y 行在位图中被空白。我通过在计算之前锁定位图来解决这个问题。

  • 场景 2。 这是主要的麻烦。我正在写入 TMemoryStream 而不是位图。同样的交易。进行计算以计算每个像素值,然后在此过程中使用 memstream.Write(bytevalue, 1) 将每个像素值写入 TMemoryStream。在所有计算结束时,我使用 memstream.SaveToFile('whatever.bmp') 将流保存到位图,然后使用 memstream.Free 释放流。如果计算很快,那么无论大小如何,流都会保存(我正在做 10000x10000 尺寸的测试)。

我什至可以告诉结果文件将被损坏,因为主应用程序窗口/表单确实有轻微的闪烁,就像它正在重新绘制一样。发生这种情况时,就好像位图和 TMemoryStream 的每个句柄都被杀死/刷新,因此现有数据已损坏。

有任何想法吗?这真的很糟糕。尤其是当每个图像可能需要一个小时才能创建时,才发现当它完成时,后台发生了某些事情并损坏了位图或 TMemoryStream。

有什么方法可以像使用位图一样锁定 TMemoryStream 句柄?这可能会有所帮助。或者一些声明告诉 Delphi “不要弄乱我的对象,即使看起来应用程序花费的时间太长”

或者有谁知道导致这种情况发生的德尔福内部的后端原因。

TMemoryStream 是在执行所有计算的过程中创建的,因此是本地对象。对于位图问题,位图是过程之外的全局变量并且它发生了,所以我认为这不是原因。

这也是在 Windows 7 下,但我注意到 Vista 下的原始位图问题。

更新1:

很抱歉没有使用评论,但是对文本大小有限制...

作为对雷米(以及其他阅读本文的人)的回复……

单线程。对于内存流,如果计算速度很快,它在 5000x5000 分辨率下工作得很好,但如果计算速度很慢,它就会失败。

作为一个基本框架,代码是沿着

如果 DoCalcs 相对较快,那么一切都按计划进行。如果它很慢,那么我得到 TMemoryStream 损坏,并且流保存到的结果位图已损坏。

这与使用内存中的 TBitmap 相同,直到我发现我可以锁定位图,这会阻止 Delphi 和/或 Windows “当它想要”时重新分配一个新的句柄,这会破坏位图中的数据。

这太巧合了,以至于不认为 TMemoryStream 及其句柄不会发生同样的问题。

更新 2:

还有一个可能有用的信息。

当 TMemoryStream 保存正常时,生成的文件(对于 5000x5000 位图)大小为 75,000,054 字节。

当保存的流损坏时,它似乎是一个随机值(从句柄损坏到流被保存的大小)。示例大小为 22 MB 和 9 MB。

当我查看生成的文件是一个十六进制编辑器时,它表明文件的开头与标题块是正确的,但尾部会以某种方式被截断。

这太奇怪了。无论如何,我绝对可以肯定在 SaveToFile 调用之后和释放它之前刷新一个 TMemoryStream?