从C ++头导入常量而不是硬编码:扩展.net控件?

问题描述 投票:1回答: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的情况下工作。

c++ .net windows vb6
1个回答
1
投票

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

据我所知,这种方法今天仍然可以在.NET中通过“COM”互操作完美地运行。您可以在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

© www.soinside.com 2019 - 2024. All rights reserved.