1

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

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

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

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

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

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&)

所以 和 的神奇价值0x10080x1015我在这段代码中的问题。

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

注意:我指的是广义上的后一个问题:不仅适用于示例所涉及的特定日历控件,还适用于任何 Windows 控件。我已经可以按名称搜索特定的 C++ 头文件(例如,对于它在中定义的示例Commctrl.h:如果我不知道如何从将 C++ 头文件放入 VB 代码中。

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

4

1 回答 1

1

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

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

Bruce McKinney所著的Hardcore Visual Basic 一书包括一个为此目的准备好的 TLB 磁盘,这在今天似乎仍然可用:

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

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


以下页面还提供了此方法的描述以及一些附加说明和示例(此处复制太长)。

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

于 2018-09-04T11:52:27.880 回答