Импорт констант из заголовков C ++ вместо их жесткого кодирования: расширение элементов управления .net? - PullRequest
0 голосов
/ 31 августа 2018

Я изучал, как расширить элементы управления .net, чтобы иметь больше свободы делать то же, что вы можете делать с обычным Windows API в C ++ в программе VB. Например, если вы хотите добавить номера недель в элемент управления календаря, вам придется вручную импортировать DLL и расширить класс элемента управления, вызывая внутренние функции Windows.

Я нашел разные темы о том, как люди справляются с этим, и я не совсем доволен «каноническим методом». Если честно, я думаю, что это довольно плохая парадигма для использования.

Эти внутренние функции 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 изменяется путем ее повторной компиляции.

1 Ответ

0 голосов
/ 04 сентября 2018

Один из подходов к этому назад для VB6 состоял в том, чтобы подготовить файл TLB с константами, объявлениями функций и т. Д. Win32 API, а затем сослаться на него в программе VB6. TLB не предоставлял COM-объекты, это был просто удобный способ упаковки всех объявлений, как если бы они были (как мы теперь думаем, это) в сборке.

Насколько я могу судить, этот подход все еще должен отлично работать сегодня в .NET через взаимодействие "COM". Вы также можете легко ссылаться на TLB в проекте C # или VB и, таким образом, получать доступ к его содержимому.

Книга Hardcore Visual Basic Брюса МакКинни включала в себя диск с подготовленным TLB для этой цели, и, кажется, он все еще доступен сегодня:

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

Я не знаю, насколько это было всеобъемлющим в то время, и действительно ли оно все еще актуально. По крайней мере, это кажется поучительным в том, как подготовить TLB для такого подхода.


На следующей странице также приведено описание этого подхода с некоторыми дополнительными пояснениями и примерами (слишком долго, чтобы копировать здесь).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...