gpt4 book ai didi

c++ - 从 C++ header 中导入常量而不是对它们进行硬编码 : extending . 网络控件?

转载 作者:行者123 更新时间:2023-11-30 04:57:17 26 4
gpt4 key购买 nike

我一直在研究如何扩展 .net 控件,以便更自由地在 VB 程序中使用 C++ 中的常规 Windows API 执行相同的操作。例如,如果要将周数添加到日历控件,则必须手动导入 DLL 并扩展控件的类,调用内部 Windows 函数。

我找到了关于人们如何处理这个问题的各种主题,但我对“规范方法”不太满意。老实说,我认为这是一个非常糟糕的范例。

这些内部窗口函数使用指针来设置魔法属性。

首先,我觉得很奇怪,一个指针的值大小取决于系统,它被滥用来保存不是内存位置而是值的东西,但除此之外:这些指针还用于设置正在设置哪个属性。

例如,(省略链接代码所需的所有样板),将一周的第一天更改为星期二将使用此代码:

Private Const MCM_FIRST As Int32 = &H1000
Private Const DTM_FIRST As Int32 = &H1000
Private Const DTM_GETMONTHCAL As Int32 = (DTM_FIRST + 8)
Private Const MCM_SETFIRSTDAYOFWEEK As Int32 = (MCM_FIRST + 15)
Dim hMonthView As IntPtr =
SendMessage(Me.Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero)
Call SendMessage(hMonthView, MCM_SETFIRSTDAYOFWEEK, 0&, 1&)

所以 0x1008 的魔法值和 0x1015是我在这段代码中的问题。

首先,这是一种相当奇怪的工作方式:据我所知,除了示例之外,这些值没有记录在任何地方。如果我需要一个目前还没有互联网教程的特性怎么办?我在哪里/如何找到 MCM_<ARBITRARY_VALUE_HERE> 的值一般情况下?

注意:我指的是广义上的后一个问题:不仅仅适用于示例所涉及的特定日历控件,而是适用于任何 Windows 控件。我已经可以按名称搜索特定的 C++ 头文件(例如,它在 Commctrl.h 中定义的示例:如果我不知道如何提取类似内容的惯用方式,那条信息就毫无用处从 C++ 头文件中提取到 VB 代码中。

其次...这些值在标题中的某处定义。是否无法从正确的标题中导入值?这样,程序将在(诚然不太可能)通过重新编译更改 DLL 的情况下继续工作。

最佳答案

VB6 的一个方法是准备一个 TLB 文件,其中包含 Win32 API 的常量、函数声明等,然后在 VB6 程序中引用它。 TLB 不提供 COM 对象,它只是一种打包所有声明的便捷方式,就像它们在(我们现在认为的)程序集中一样。

据我所知,通过“COM”互操作,这种方法今天在 .NET 中仍然可以很好地工作。您可以在 C# 或 VB 项目中轻松引用 TLB,从而访问其内容。

本书Hardcore Visual Basic by Bruce McKinney包括一个带有为此目的准备好的 TLB 的磁盘,今天似乎仍然可用:

http://vb.mvps.org/hardweb/mckinney2a.htm

我不知道这在当时有多全面,也不知道它是否真的仍然是最新的。至少,它似乎对如何为此类方法准备 TLB 具有指导意义。


下一页还提供了对这种方法的描述,以及一些额外的解释和示例(太长,无法在此处复制)。

http://www.brainbell.com/tutors/Visual_Basic/newfile156.html

关于c++ - 从 C++ header 中导入常量而不是对它们进行硬编码 : extending . 网络控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52110580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com