存储此指针以便在 WndProc 中使用的最佳方法

2024-01-26

我有兴趣知道存储的最佳/常见方法this指针用于在WndProc。我知道有几种方法,但据我了解,每种方法都有自己的缺点。我的问题是:

生成此类代码有哪些不同的方法:

CWindow::WndProc(UINT msg, WPARAM wParam, LPARAM)
{
  this->DoSomething();
}

我可以想到 Thunk、HashMap、线程本地存储和窗口用户数据结构。

这些方法的优点/缺点是什么?

代码示例和建议可获得积分。

这纯粹是出于好奇心。使用 MFC 之后,我只是想知道它是如何工作的,然后开始考虑 ATL 等。

Edit:我最早可以在什么地方有效使用HWND在窗口过程中?它被记录为WM_NCCREATE- 但如果你真的进行实验,那就是not要发送到窗口的第一条消息。

Edit:ATL 使用 thunk 来访问 this 指针。 MFC 使用哈希表查找HWNDs.


这个问题在 SO 上有很多重复和几乎重复的问题,但我见过的几乎没有一个答案探讨了他们选择的解决方案的陷阱。

有多种方法可以将任意数据指针与窗口关联起来,并且需要考虑两种不同的情况。根据不同的情况,可能性也不同。

情况 1 是当您编写窗口类时。这意味着您正在实施WNDPROC,并且您的意图是让其他人在他们的应用程序中使用您的窗口类。您通常不知道谁将使用您的窗口类以及用途。

情况 2 是当您使用自己的应用程序中已存在的窗口类时。一般来说,您无权访问窗口类源代码,也无法对其进行修改。

我假设这个问题isn't将数据指针放入WNDPROC最初(这只是通过CREATESTRUCTlpParam参数输入CreateWindow[ExW]),而是如何存储它以供后续调用。

方法一:cbWndExtra

当 Windows 创建窗口实例时,它会在内部分配一个WND结构。该结构体具有一定的大小,包含各种与窗口相关的内容,例如它的位置、窗口类和当前的 WNDPROC。在此结构的末尾,Windows 有选择地分配属于该结构的许多附加字节。该数字指定于WNDCLASSEX.cbWndExtra,它用于RegisterWindowClassEx.

这意味着只有当您是注册窗口类的人时才能使用此方法,即您是编写窗口类.

应用程序无法直接访问WND结构。相反,使用GetWindowLong[Ptr]。非负索引访问结构末尾额外字节内的内存。 “0”将访问第一个额外字节。

如果您正在编写窗口类,那么这是一种干净、快速的方法。大多数Windows内部控件似乎都使用这种方法。

不幸的是,这种方法在对话框中表现不佳(DialogBox家庭)。除了提供对话框模板之外,您还将拥有一个对话框窗口类,这可能会变得维护起来很麻烦(除非您出于其他原因需要这样做)。如果您确实想在对话框中使用它,则必须在对话框模板中指定窗口类名称,并确保在显示对话框之前已注册该窗口类,并且您需要实现一个WNDPROC对于对话框(或使用DefDlgProc)。此外,所有对话框都已经在其中保留了一定数量的字节cbWndExtra使对话管理器正常工作。需要的额外字节数是DLGWINDOWEXTRA持续的。这意味着your东西需要来after对话框已经保留的额外字节。将所有对额外内存的访问偏移量DLGWINDOWEXTRA(包括值cbWndExtra您在窗口类中指定的)。

另请参阅下面的对话框专用的额外方法。

方法2:GWLP_USERDATA

之前所提WNDstruct 恰好包含一个指针大小的字段,系统不使用该字段。它是使用以下方式访问的GetWindowLongPtr具有负索引(即GWLP_USERDATA)。负索引将访问内部的字段WND结构。请注意,根据this https://winterdom.com/dev/ui/wnd/,负索引似乎并不代表内存偏移量,而是任意的。

问题在于GWLP_USERDATA就是不清楚,过去也一直不清楚,什么exactly该字段的目的就是该字段的所有者是谁。也可以看看这个问题 https://stackoverflow.com/questions/41521809/who-is-owner-of-gwlp-userdata-cell. 普遍的共识是没有共识。可能就是这样GWLP_USERDATA本来是要被使用的窗口的用户, 并不是窗口类的作者。这意味着在 WNDPROC 内部使用它是完全不正确的,因为 WNDPROC 始终由窗口类作者提供。

我个人确信这是工程师们提出的意图GWLP_USERDATA仅仅因为如果这是真的,那么整个 API 就是健全的、可扩展的且面向未来的。但如果不是这样,那么 API 就不是这两个,而且它会是多余的cbWndExtra.

我所知道的所有标准 Windows 控件(例如BUTTON, EDIT等)遵守这一点并且不要使用GWLP_USERDATA在内部,将其保留给窗口uses这些控制。问题是有太多的例子,包括在 MSDN 和 SO 上,它们打破了这个规则并使用GWLP_USERDATA用于实现窗口类。这有效地消除了最干净、最简单的控制方法user将上下文指针与它相关联,只是因为太多人做“错误”(根据我对“错误”的定义)。最坏的情况是,用户代码不知道GWLP_USERDATA被占用,并且可能会覆盖它,这可能会导致应用程序崩溃。

由于长期存在的所有权争议GWLP_USERDATA,一般来说使用它并不安全。如果你是创作一个窗口类,无论如何你可能永远都不应该使用它。如果你是using一个窗口,只有当您确定它不被窗口类使用时才应该这样做。

方法三:设置属性

The SetProp函数族实现对属性表的访问。每个窗口都有其自己独立的属性。该表的键在 API 表面级别是一个字符串,但在内部它实际上是一个 ATOM。

SetProp可以被窗口类使用authors,和窗口users,它也有问题,但它们不同于GWLP_USERDATA。您必须确保用作属性键的字符串不会发生冲突。窗口用户可能不一定知道窗口类作者在内部使用什么字符串。尽管冲突不太可能发生,但您可以通过使用 GUID 作为字符串等方式完全避免冲突。从全局 ATOM 表的内容可以明显看出,许多程序都以这种方式使用 GUID。

SetProp必须小心使用。大多数资源并没有解释这个函数的缺陷。在内部,它使用GlobalAddAtom。这有几个含义,使用此函数时需要考虑这些含义:

  • 打电话时SetProp(或任何其他使用全局 ATOM 表的 API),您可以使用ATOM,当您注册一个新字符串时得到的GlobalAddAtom。 ATOM 只是一个整数,它引用 ATOM 表中的一个条目。这将提高性能;SetProp内部总是使用ATOMs 作为属性键,而不是字符串。传递字符串会导致SetProp以及类似的函数,首先在 ATOM 表中内部搜索匹配项。通过一个ATOM直接跳过在全局原子表中搜索字符串。

  • 全局原子表中可能的字符串原子数量在系统范围内限制为 16384。这是因为原子是 16 位 uint,范围从0xC000 to 0xFFFF(以下所有值0xC000是指向固定字符串的伪原子(使用起来完全没问题,但你不能保证没有其他人在使用它们))。使用许多不同的属性名称不是一个好主意,更不用说这些名称是在运行时动态生成的了。相反,您可以使用单个属性来存储指向包含您需要的所有数据的结构的指针。

  • 如果您使用 GUID,则可以安全地使用相同的 GUIDevery您正在使用的窗口,甚至跨不同的软件项目,因为每个窗口都有自己的属性。这样,你所有的软件最多只会用完two全局原子表中的条目(作为窗口类作者,您最多需要一个 GUID,作为窗口类用户,您最多需要一个 GUID)。事实上,定义两个事实上的标准 GUID 可能是有意义的,每个人都可以将其用作上下文指针(实际上不会发生)。

  • 因为属性使用GlobalAddAtom,您必须确保原子未注册。当进程存在时,全局原子不会被清理,并且会堵塞全局原子表,直到操作系统重新启动。为此,您必须确保RemoveProp叫做。这样做的好地方通常是WM_NCDESTROY.

  • 全局原子是引用计数的。这意味着计数器可能在某个时刻溢出。为了防止溢出,一旦原子的引用计数达到65536,该原子将永远保留在原子表中,并且无论再多GlobalDeleteAtom可以摆脱它。在这种情况下,必须重新启动操作系统才能释放原子表。

如果要使用,请避免使用许多不同的原子名称SetProp。除此之外,SetProp/GetProp这是一种非常干净和防御性的方法。如果开发人员同意为所有窗口使用相同的 2 个原子名称,原子泄漏的危险可能会大大减轻,但这不会发生。

方法4:设置窗口子类

SetWindowSubclass是为了允许覆盖WNDPROC特定窗口的,以便您可以在自己的回调中处理一些消息,并将其余消息委托给原始窗口WNDPROC。例如,这可以用于监听特定的组合键EDIT控制,同时将其余消息留给其原始实现。

一个方便的副作用SetWindowSubclass那是new, 替代品WNDPROC实际上不是一个WNDPROC, but a SUBCLASSPROC.

SUBCLASSPROC有 2 个附加参数,其中之一是DWORD_PTR dwRefData。这是任意指针大小的数据。数据来自你,通过最后一个参数来SetWindowSubclass。然后数据被传递到每次调用替换的SUBCLASSPROC。要是every WNDPROC有了这个参数,我们就不会陷入这种可怕的境地了!

This method only helps the window class author.(1) During the initial creation of the window (e.g. WM_CREATE), the window subclasses itself (it can allocate memory for the dwRefData right there if that's appropriate). Deallocation probably best in WM_NCDESTROY. The rest of the code that would normally go in WNDPROC is moved to the replacement SUBCLASSPROC instead.

它甚至可以在对话框自己的中使用WM_INITDIALOG信息。如果对话框显示为DialogParamW,最后一个参数可以用作dwRefData in a SetWindowSubclass调用WM_INITDIALOG信息。然后,所有其余的对话逻辑都进入新的SUBCLASSPROC,它将收到这个dwRefData对于每条消息。请注意,这会稍微改变语义。您现在正在对话框的级别上编写window过程,而不是对话过程。

在内部,SetWindowSubclass使用属性(使用SetProp) 其原子名称为UxSubclassInfo。每个实例SetWindowSubclass使用这个名称,因此它实际上已经存在于任何系统的全局原子表中。它取代了原来的窗口WNDPROC with a WNDPROC called MasterSubclassProc。该函数使用中的数据UxSubclassInfo属性来获得dwRefData并致电所有已登记的SUBCLASSPROC功能。这也意味着您可能不应该使用UxSubclassInfo作为您自己的任何事物的属性名称。

方法5:Thunk

thunk 是一个小函数,其机器代码在运行时在内存中动态生成。它的目的是调用另一个函数,但带有似乎神奇地突然出现的附加参数。

这可以让你定义一个函数,就像WNDPROC,但它还有一个附加参数。该参数可以等效于“this”指针。然后,在创建窗口时,替换原始存根WNDPROC伴随着一声重击,调用真实的、伪的——WNDPROC带有附加参数。

其工作原理是,当创建 thunk 时,它会在内存中为加载指令生成机器代码,将额外参数的值加载为constant,然后是跳转到通常需要附加参数的函数地址的指令。然后可以像常规的一样调用 thunk 本身WNDPROC.

该方法可供窗口类作者使用,并且速度极快。然而,实施并非易事。这AtlThunk https://learn.microsoft.com/en-us/windows/win32/api/atlthunk/nf-atlthunk-atlthunk_initdata函数族实现了这一点,但有一个怪癖。它不添加extra范围。相反,它replaces the HWND的参数WNDPROC使用您的任意数据(指针大小)。但是,这并不是一个大问题,因为您的任意数据可能是指向包含以下内容的结构的指针HWND窗户的。

类似地SetWindowSubclass方法,您可以在创建窗口期间使用任意数据指针创建 thunk。然后,更换窗户WNDPROC随着一声重响。所有真正的工作都在新的、伪的中进行WNDPROC这是 thunk 的目标。

thunk 根本不会扰乱全局原子表,也没有字符串唯一性的考虑。然而,就像堆内存中分配的所有其他内容一样,它们必须被释放,之后,可能不再调用 thunk。自从WM_NCDESTROY是窗口收到的最后一条消息,这是执行此操作的地方。否则,您必须确保重新安装原始版本WNDPROC当释放 thunk 时。

请注意,这种将“this”指针走私到回调函数中的方法实际上在许多生态系统中都很普遍,包括 C# 与本机 C 函数的互操作。

方法六:全局查表

不需要长篇大论的解释。在您的应用程序中,实现一个全局表来存储HWNDs 作为键,上下文数据作为值。您负责清理桌子,并在需要时使其足够快。

窗口类作者可以使用私有表来实现,窗口用户可以使用自己的表来存储特定于应用程序的信息。不用担心原子或字符串的唯一性。

底线

如果你是这样的人,这些方法就有效窗口类作者:

cbWndExtra、(GWLP_USERDATA)、SetProp、SetWindowSubclass、Thunk、全局查找表。

窗口类作者意味着您正在编写WNDPROC功能。例如,您可能正在实现一个自定义图片框控件,它允许用户平移和缩放。您可能需要额外的数据来存储平移/缩放数据(例如作为 2D 变换矩阵),以便您可以实现您的WM_PAINT正确编码。

建议:避免使用 GWLP_USERDATA,因为用户代码可能依赖它;如果可能,请使用 cbWndExtra。

如果你是这样的人,这些方法就有效窗口用户:

GWLP_USERDATA、SetProp、全局查找表。

窗口用户意味着您正在创建一个或多个窗口并在您自己的应用程序中使用它们。例如,您可能会动态创建数量可变的按钮,每个按钮都与单击时相关的不同数据相关联。

建议:如果它是标准 Windows 控件,请使用 GWLP_USERDATA,或者您确定该控件不会在内部使用它。否则,SetProp.

使用对话框时额外提及

默认情况下,对话框使用具有以下功能的窗口类cbWndExtra set to DLGWINDOWEXTRA。可以为对话框定义您自己的窗口类,您可以在其中分配,例如,DLGWINDOWEXTRA + sizeof(void*),然后访问GetWindowLongPtrW(hDlg, DLGWINDOWEXTRA)。但这样做时,您会发现自己必须回答您不喜欢的问题。例如,哪个WNDPROC你用吗(答案:你可以用DefDlgProc),或者您使用哪种类样式(默认对话框碰巧使用CS_SAVEBITS | CS_DBLCLKS,但祝你好运找到权威的参考)。

DLGWINDOEXTRA字节,对话框恰好保留了一个指针大小的字段,可以使用GetWindowLongPtr带索引DWLP_USER。这是一种额外的GWLP_USERDATA,并且理论上也存在同样的问题。在实践中,我只见过它在内部使用过DLGPROC最终被传递给DialogBox[Param]。毕竟,窗口用户仍然有GWLP_USERDATA。因此,使用它可能是安全的窗口类的实现几乎在所有情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储此指针以便在 WndProc 中使用的最佳方法 的相关文章

  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • 阶级等级制度中频繁的贬低总是邪恶的吗?

    据我所知 如果在类层次结构中频繁使用向下转型是没有好处的 我同意这一点 但是这条规则有哪些例外情况 如果有的话 这就是我的图形编辑器设计的薄弱之处 我有两个层次结构 其中几何图形层次结构与图形基元分离 像这样 public class Ge
  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 有没有办法让我的程序用更少的代码运行?

    我为学校作业编写了以下代码 它编译并打印所有正确的消息 但出于我自己的好奇心 我想知道我的代码是否可以缩短并且仍然有效 我尝试了 signal 而不是 sigaction 但我听说 sigaction 比 signal 更受青睐 此外 此任
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • DataContractJsonSerializer 包含元素类型子类型的通用列表

    我要使用DataContractJsonSerializer用于 JSON 序列化 反序列化 我在 JSON 数组中有两种对象类型 并希望将它们都反序列化为相应的对象类型 具有以下类定义 DataContract public class
  • C++ 中类型信息何时向后流动?

    我刚刚看了 Stephan T Lavavej 的演讲CppCon 2018关于 类模板参数推导 在哪里某个点 https youtu be H ut6j1BYU t 941他顺便说 在 C 中 类型信息几乎永远不会向后流动 我不得不说 几
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 从某个文件夹启动随机批处理文件

    问题是这样的 我有一个名为 abc 的文件夹 其中包含几个批处理文件 它们的命名如下 abc1 batabc2 batabc3 batabc4 bat 等等 我需要一个脚本 当我单击它时 它会随机启动其中一个批处理文件 我需要的脚本将存储在
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在

随机推荐

  • 如何在休眠中为自身实体添加@onetoone映射

    如何为自身实体添加一对一映射 就像这个例子一样 我想为 Person 本身建立父子关系 Entity Table name PERSON public class Person Id Column name personId private
  • 在 make 中“触及”目标是什么意思?

    例如 从 mingw32 make exe help 选项 t touch Touch targets instead of remaking them 它只是意味着更新文件修改时间 这样下次就不会认为这些文件是旧的
  • CSS - 在电脑上分屏但在移动设备上堆叠

    我试图将我的页面分成 4 个相等的部分 我想将左上角水平分成 2 个部分 我主要关心的是它在移动设备上的表现 我不希望它像在电脑上那样被分割 我希望它被堆叠起来 块在另一个上面 如图所示 我想过引导网格 但我做不到 到目前为止我所拥有的内容
  • 如何使用量角器+角度获取迭代器索引/键?

    通过中继器查找元素时有没有办法访问迭代器索引 键 protractor By repeater id cat in pets 在本例中 我希望访问猫的 id id 不是表中显示为值的列之一 它用于导航ng click goto pets c
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证失败

    我在用Authlogic 连接 https github com viatropos authlogic connect用于第三方登录 运行适当的迁移后 Twitter Google yahoo 登录似乎工作正常 但 facebook 登录
  • 为什么 Python 中对集合的处理不统一?

    Python 中集合和列表的处理方式不同 并且似乎没有统一的方法来处理这两者 例如 将一个项目添加到set是使用完成的add方法 并且对于list它是使用完成的append方法 我知道这背后有不同的语义 但也有共同的语义 并且通常与某些集合
  • 用于电子邮件的 JUnit 报告单页 XSLT

    我有一个 Junit 进程 每天晚上运行大量数据完整性测试 我希望它以格式良好的 HTML 电子邮件形式发送结果 问题是 JUnit 中内置的 HTML 格式化程序使用框架和外部样式表 因此它不适合电子邮件 普通格式化程序将结果埋在一堆原本
  • 未捕获的语法错误:计算时出现意外的标识符

    我有一些返回一个的代码Uncaught SyntaxError当我运行它但我不明白为什么 我尝试将其通过 JSHint 但无济于事 这是明显错误的代码 function compute expr x string var whatisx x
  • Java8计算地图中对象列表的平均值

    初始数据 public class Stats int passesNumber int tacklesNumber public Stats int passesNumber int tacklesNumber this passesNu
  • MongoDB:如何在 C# 中加载带有嵌套数组的集合?

    我有一个名为 服务器 的集合 其中包含以下文档 name West ip 123 123 123 123 channels name English port 1234 status 0 name Spanish port 1235 sta
  • 为什么带有空格的 cookie 值到达客户端时会带有引号?

    我是一名 NET 开发人员 开始涉足 Java 在 NET 中 我可以将 cookie 的值设置为其中包含空格的字符串 new HttpCookie myCookieName my value 当我在客户端 JavaScript 读取该值时
  • 批处理文件重复以前的工作程序

    我需要有关批处理脚本的帮助 它运行得很好 但后来当我想运行它时 它不断重复我之前显示的结果 例如 我上周执行了一个名为运行 echo 程序上周首先运行 的程序 当我今天尝试通过 echo 这是今天 运行它时 它运行并显示之前的结果 PS 代
  • 从 Composer 在 dataproc 集群上执行 bash 脚本

    我想在使用简单的 shell 脚本创建集群后将 jar 添加到特定位置的 dataproc 集群中 创建 dataproc 集群后 我想自动执行此步骤以从 Composer 运行 下一步是执行 bash 脚本 该脚本会将 jar 添加到 d
  • jinja 2 库中的语法错误

    为了在 suse Linux 服务器上运行 IPython Notebook 我需要安装jinja2图书馆 pip 3 2 install jinja2 安装打印语法错误 https gist github com anonymous 62
  • TSLint 不适用于 CRA 和 TypeScript

    我花了几个小时绞尽脑汁试图为使用 create react app 创建的 TypeScript 项目启用 linting The wmonk create react app typescript https github com wmo
  • 从 vuex 存储访问 $vuetify 实例属性

    我正在使用vuetify并想改变主题vuex存储使用 vuetify https vuetifyjs com en style theme实例但我收到这个错误Cannot set property theme of undefined 这是
  • JDBCPreparedStatement - 使用相同的参数,可能吗?

    我正在使用 插入或更新 查询 如下所示 String sql INSERT INTO servlets path applicationId startTime numOfRequests totalResponseTime totalBy
  • WPF 中的 Icollectionview 排序和分组

    我在 WPF 中创建了一个 listview 控件并成功完全绑定Icollectionview的对象ObservableCollection 我的列表视图列是动态创建的 我必须对列表视图进行排序和分组 但它无法正常工作 我的代码如下 pri
  • 使用 iTextSharp 4.1.6.0 对 PDF 进行数字签名

    是否可以使用 iTextSharp 4 1 6 0 对 PDF 进行数字签名 如果是的话 是否有一些 C 示例文档 是的 可以使用该版本进行签名 有关于如何签名的说明 互联网档案馆是您的friend https web archive or
  • 存储此指针以便在 WndProc 中使用的最佳方法

    我有兴趣知道存储的最佳 常见方法this指针用于在WndProc 我知道有几种方法 但据我了解 每种方法都有自己的缺点 我的问题是 生成此类代码有哪些不同的方法 CWindow WndProc UINT msg WPARAM wParam