问题标签 [winapi]

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 投票
8 回答
327 浏览

.net - 随着摩尔定律的通过,您是否认为框架可能会发生转变?

框架以牺牲操作系统的速度和混淆为代价来简化编码。随着摩尔定律的通过,您是否认为框架可能会发生转变?

我怀疑 Vista 没有取得巨大成功的原因之一是它的运行速度比 XP 慢得多,而且由于计算机的速度没有像过去那样大幅度提高,这种变化似乎是一种倒退。

多年来,CPU 的速度超过了软件的速度,因此增加了操作系统混淆和膨胀层的新框架几乎没有造成什么伤害。想象一下 Windows 95 在今天的硬件上运行的速度有多快(给定一些内存调整)。Win2K 和 WinXP 是很大的改进,我们可以忍受它们因为更快的计算机而变得更慢。

然而,即使在几年前,我注意到用 MS 基础类编写的程序看起来并不像直接编写到 API 中的代码那样清晰。由于这些框架(如 .Net 和其他框架)的激增只会使这种情况变得更糟,我们是否可能会发现能够将“C”代码直接写入 Win32 API(或其他操作系统中的等价物)将成为强大的竞争优势,即使它确实需要更长的时间来写?或者在更长的开发时间中进行权衡是否不值得?

0 投票
2 回答
777 浏览

c++ - 为什么我不能在 VS.NET 调试器中单步执行剪贴板代码?

理想情况下,读者已将本机 C++ 程序升级到 Visual Studio 2008,其中包含一个 OpenClipboard() 块。为什么不尝试在从 OpenClipboard() 获得成功的返回码并单步执行代码之后设置断点。根据互联网,它可能适用于您的系统,但当然,不适用于我的系统,感谢您的尝试。

谷歌搜索例如 (( OpenClipboard 1418 vc6 )) 会发现诸如“GetClipboardData 在调试器中失败”和“在 VC++6 中没有错误但在 VC++2005 中出错”之类的文章。目前实用,问题已解决 - 我根本无法在此类代码中设置断点,我需要存储信息并在剪贴板操作完成后设置断点。错误 1418 是“线程没有打开剪贴板”,但只要您不使用 VS.NET,它就可以正常工作,或者就像我说的,如果您将断点保留在剪贴板打开关闭块之外。

知道 VS.NET 调试器的确切问题是什么,我会感觉更好。

作为一个 C++ 人,我只是模糊地意识到在做 dot-Net 时你不应该考虑线程。无论如何,当您单步通过本机 C++ 代码时,我没有找到真正发生的事情的大师级解释,事实上问题是否在于 dot-Net 调试器以某种方式巧妙地干扰了线程信息。

系统方面:大约一年前,两个双核 Xeon,根据 XP-pro 的 4 个 CPU。我刚刚通过在 XP-SP2-32 位下的 vc6 中单步调试代码。所以我知道代码在 vc6 下非常好。但是,当我使用 10 兆字节的 CF_TEXT 进行测试时,我遇到了异常。我想尝试在 XP-x64 更好的异常模型下调试。

用visual-studio-2008重新编译,我根本无法让代码单步运行。OpenClipboard 工作,但 EnumClipboardFormats() 没有工作,单步时没有任何工作。但是,当我在完整的代码块下方设置断点时,一切正常。YES vc2008 对 szBuf 周围的堆栈帧损坏进行了精确诊断。vc2008 有很多值得喜欢的地方。如果这只是一个剪贴板问题,那就太好了 - 不知道我会被迫担心通过任何事情,线程上下文问题是否可能是由于 dot-Net-debugger。

0 投票
5 回答
1028 浏览

c - 在 Win32 上停止进程的最干净方法?

在用 C++ 实现应用服务器及其客户端库时,我无法找到一种干净可靠的方法来在 Windows 上的服务器关闭时停止客户端进程。

假设服务器和它的客户端在同一个用户下运行,要求是:

  • 该解决方案应适用于以下情况:
    • 每个客户端都可能具有控制台或 gui。
    • 用户可能没有特权。
    • 客户端可能会或变得无响应(无限循环、死锁)。
    • 客户端可能是也可能不是服务器的孩子(直接或间接)。
  • 除非被客户端缺陷阻止,否则应允许客户端有机会干净地退出(释放他们的资源,将一些数据同步到磁盘......)和一些合理的时间这样做。
  • 在关闭过程中,所有客户端返回代码都应提供给服务器(如果可能)。
  • 服务器将等到所有客户端都消失。

截至本次编辑,以下大多数答案都主张在服务器及其客户端之间使用共享内存(或其他 IPC 机制)来传达关闭命令和客户端状态。这些解决方案可以工作,但需要客户端成功初始化库。

我没有说的是,服务器还用于启动客户端,在某些情况下,其他程序/脚本根本不使用客户端库。不依赖于服务器和客户端之间的优雅通信的解决方案会更好(如果可能的话)。

前段时间,我偶然发现了一个 C 代码片段(我相信在 MSDN 中),它执行了以下操作:

  1. 在进程中通过 CreateRemoteThread 启动一个线程来关闭。
  2. 让那个线程直接调用ExitProcess。

不幸的是,现在我正在寻找它,但我无法找到它,而且搜索结果似乎暗示这个技巧在 Vista 上不再适用。对此有任何专家意见吗?

0 投票
1 回答
3976 浏览

winapi - 更改 USERPostMessageLimit 的后果

我们的一个遗留应用程序严重依赖于PostThreadMessage()线程间通信,因此我们将注册表中的 USERPostMessageLimit(方式)增加到超过正常的 10.000。

但是,MSDN 上的文档指出“这个限制应该足够大。如果您的应用程序超出限制,则应重新设计它以避免消耗如此多的系统资源。” [ 1 ]

谁能告诉我消耗过多的系统资源究竟是如何表现出来的?究竟什么是系统资源?我可以以某种方式监控应用程序对系统资源的使用情况吗?任何信息都将非常有助于确定是否值得花时间和精力重新设计此应用程序。

0 投票
7 回答
1019 浏览

windows - 如何实现进程内全文搜索引擎

在我们的一个商业应用程序(Win32,用 Delphi 编写)中,我们希望实现全文搜索。该应用程序以某种无法直接识别为文本的二进制格式存储用户数据。

理想情况下,我想找到一个进程内解决方案(DLL 可以)或我可以通过 TCP 访问的本地服务器(最好)。API 应该允许我向服务器提交文本信息(以及表示它来自的二进制 blob 的元数据),当然,它应该允许我进行全文搜索,至少对逻辑运算符的支持最少和子字符串搜索。需要 Unicode 支持。

我在 Stack Overflow 上找到了广泛的搜索引擎列表(有哪些搜索服务器?),但我并不真正了解哪些引擎可以满足我的需求。在我花一两天时间测试他们每个人之前,我想征求 The Collective 的意见。

有什么建议么?

0 投票
18 回答
87869 浏览

c++ - 如何在 Windows 上使线程睡眠时间少于一毫秒

在 Windows 上,我有一个在 Unix 上从未遇到过的问题。这就是如何让线程休眠不到一毫秒。在 Unix 上,您通常有多种选择(sleep、usleep 和 nanosleep)来满足您的需求。然而,在 Windows 上,只有毫秒粒度的睡眠。

在 Unix 上,我可以使用select系统调用来创建微秒睡眠,这非常简单:

我怎样才能在 Windows 上达到同样的效果?

0 投票
4 回答
8625 浏览

windows - 原始 Win32 中的富编辑控件

Rich Edit Controls 的文档是否真的像看起来那样糟糕(错误?)?现在我手动调用 LoadLibrary("riched20.dll") 以显示富编辑控件。Rich Edit 的文档在使用 Rich Edit 控件的第一个代码示例中未能很好地说明这一点。

它谈到调用 InitCommonControlsEx() 来添加视觉样式,但没有提到要传入哪些标志。

有没有更好的方法来加载 Rich Edit 控件?

http://msdn.microsoft.com/en-us/library/bb787877(VS.85).aspx

这是我可以编写使其工作的唯一代码:

0 投票
5 回答
37484 浏览

c - 使用 Win32 API 安全删除 USB 驱动器?

如何使用 Win32 API 移除 USB 驱动器?我在嵌入式系统上做了很多工作,其中一个我必须将我的程序复制到 U 盘上并将其插入目标硬件。

由于我主要在控制台上工作,我不喜欢每天使用鼠标点击任务栏小图标一百次。

我很想写一个小程序来做这件事,这样我就可以把它放到我的makefile中,但是我还没有找到任何做同样事情的API调用。

有任何想法吗?

0 投票
4 回答
2467 浏览

.net - .Net 中的异步文件 IO

我正在用 C# 构建一个玩具数据库,以了解有关编译器、优化器和索引技术的更多信息。

我想在将页面带入缓冲池的(至少读取)请求之间保持最大并行度,但我对如何在 .NET 中最好地实现这一点感到困惑。

以下是一些选项以及我遇到的问题:

  1. 用途System.IO.FileStreamBeginRead方法

    但是,文件中的位置不是 的参数BeginRead,它是FileStream(通过Seek方法设置)的属性,所以我一次只能发出一个请求,并且必须在持续时间内锁定流。(或者我是吗?文档不清楚如果我只在SeekandBeginRead调用之间持有锁但在调用之前释放它会发生什么EndRead。有人知道吗?)我知道该怎么做,我只是不确定它是最好的办法。

  2. 似乎还有另一种方式,以System.Threading.Overlapped结构和 P\Invoke 为 中心ReadFileEx在 kernel32.dll 中的函数。

    不幸的是,缺乏样本,尤其是在托管语言中。这条路线(如果它可以工作的话)显然还涉及ThreadPool.BindHandle线程池中的方法和IO完成线程。我的印象是这是在 Windows 下处理这种情况的认可方式,但我不明白,我找不到对初学者有帮助的文档的入口点。

  3. 还有什么?

  4. 在评论中,雅各布建议FileStream为飞行中的每一次阅读创建一个新的。

  5. 将整个文件读入内存。

    如果数据库很小,这将起作用。代码库很小,还有很多其他的低效率,但数据库本身不是。我还想确保我正在做处理大型数据库所需的所有簿记(事实证明这是复杂性的很大一部分:分页、外部排序......)我担心它可能也是容易不小心作弊。

编辑

澄清为什么我对解决方案 1 持怀疑态度:从 BeginRead 到 EndRead 一直持有一个锁意味着我需要阻止任何想要启动读取的人,因为另一次读取正在进行中。这感觉不对,因为启动新读取的线程可能(通常)能够在结果可用之前做更多的工作。(实际上,仅仅写这篇文章就让我想到了一个新的解决方案,我把它作为一个新的答案。)

0 投票
6 回答
2501 浏览

winapi - 诊断 Win32 程序中的死锁

调试由于 Win32 生产过程中的死锁而导致的明显挂起的步骤和技术是什么。我听说 WinDbg 可以用于此目的,但您能否提供有关如何实现此目的的明确提示?