VisualBasic + WinAPI

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kiber_punk
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 11.01.2011 (Вт) 2:23

VisualBasic + WinAPI

Сообщение kiber_punk » 18.01.2011 (Вт) 19:25

Посоветуйте литературу/статьи/ресурсы(ссылки) по использованию WinAPI в VB.
Mea culpa

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 18.01.2011 (Вт) 19:43

В таким случаев принято давать ссылки на Дэниела Эпплмана, но я не признаю его книжку, в ней много ошибок.

Использования WinAPI в VB мало чем отличается от использования WinAPI в других языках. Нужно читать первоисточник — документацию по API из MSDN.

Все особенности использования WinAPI в VB не специфичны для самих API а проистекают из особенностей VB. Соответственно, и читать нужно о секретах, хитростях и тонкостях устройства VB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kiber_punk
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 11.01.2011 (Вт) 2:23

Re: VisualBasic + WinAPI

Сообщение kiber_punk » 18.01.2011 (Вт) 22:35

Не мог бы привести общий пример импорта библиотек и вызова функций?
Mea culpa

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 18.01.2011 (Вт) 22:38

Обычный импорт: нужная функция объявляется в TLB, TLB подключается к проекту. Вызывается как обычная функция.
Отложенный импорт: нужная функция объявляется с помощью Declare Sub/Function, почти так же, как обычная. Вызывается как обычная функция.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 18.01.2011 (Вт) 23:06

Хакер писал(а):Обычный импорт: Отложенный импорт:

kiber_punk
Причем все это относится к раннему связыванию. Если программа не найдет библиотеку с функцией, то программа не запустится совсем.
Есть же еще такая вещь как позднее связывание. Что очень удобно при, например, написании плагинов. Программа запускается, в ней загружается библиотека, и если программа библиотеку не найдет, то программист сможет обработать ошибку и выдать соответствующее предупреждение пользователю.
Кроме того, в VB6 в основном используются ActiveX DLL, которые подключаются через пункт меню. В этих библиотеках передаются целые классы, что задумывалось как штука несомненно удобная. Но многим не нравится.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 6:39

Денис писал(а):Если программа не найдет библиотеку с функцией, то программа не запустится совсем.

А ошибку отлавливать не пробовал?
:lol:
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 19.01.2011 (Ср) 6:40

arthur2 писал(а):А ошибку отлавливать не пробовал?
:lol:


Прямо в ядре системы :?

P.S. Впрочем, Денис тоже испортил свой пост с тех пор, как я прочитал его впервые.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 6:44

При обычном импорте через тлб - да, не запустится, при Declare - ошибка ловится без каких-либо ухищрений. Даже можно поискать ненайденную библиотеку.
Артур
 
   

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: VisualBasic + WinAPI

Сообщение BV » 19.01.2011 (Ср) 11:10

Хакер писал(а):Обычный импорт: нужная функция объявляется в TLB, TLB подключается к проекту

Я уже говорил это Артуру, повторю и тебе: а с каких пор TLB и IDL стали частью VB? Это отдельная технология и отдельный язык, не имеющие ничего, кроме COM, общего с VB. И упоминать TLB в качестве решения раннего связывания допустимо только как хак
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 19.01.2011 (Ср) 11:18

BV писал(а):Я уже говорил это Артуру, повторю и тебе: а с каких пор TLB и IDL стали частью VB?

Я уже слышал эту глупость. С тем же успехом можно сказать, что и WinAPI не являются частью VB, а значит это хак.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 12:03

BV С каких пор то, что подключается штатным способом - является хаком? Тогда уж и подключение ActiveX (которые - о ужас! - тоже могут быть написанны на других языках) - это тоже хаки :lol:

Возможно, я тебя удивлю, но при подключении референцев в диалоге открытия файлов в поле "Тип файлов" числится ПО УМОЛЧАНИЮ : "Type Librearies (*.olb;*.tlb;*.dll)"
Последний раз редактировалось arthur2 19.01.2011 (Ср) 13:02, всего редактировалось 2 раз(а).
Артур
 
   

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 12:48

arthur2 писал(а):При обычном импорте через тлб - да, не запустится, при Declare - ошибка ловится без каких-либо ухищрений. Даже можно поискать ненайденную библиотеку.

Код в студию!
Но даже если и можно отловить ошибку, все равно обработка ошибки будет при запуске приложения?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 19.01.2011 (Ср) 12:57

Денис писал(а):Код в студию!

Вполне сам можешь вызов функции обрамить On-Error-ами.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 12:57

Денис писал(а):Код в студию!

on error goto errH:
Не?
Денис писал(а):Но даже если и можно отловить ошибку, все равно обработка ошибки будет при запуске приложения?

Ошибка будет происходить при первом вызове задекларированной функции. При обработке ошибки нужно сменить текущую директорию и снова вызвать функцию - если библа будет там, то функция сработает.

Хакер, кстати, предлагал ещё какой-то способ - можно поискать по форуму.
Артур
 
   

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 13:03

arthur2 писал(а):При обработке ошибки нужно сменить текущую директорию и снова вызвать функцию - если библа будет там, то функция сработает.

К сожалению, у меня нет бейсика под рукой, чтоб проверить. Но в любом случае, после ключевого слова Lib требуется обязательно указать строку-константу. Из-за этого описаные тобой костыли. А если у программы несколько плагинов в разных папках, так и скакать по ним? Глупо.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 13:06

Денис писал(а):после ключевого слова Lib требуется обязательно указать строку-константу
в которой допустимы относительные пути :)

И кстати по-моему (поправьте, если это не так), после первого вызова функции искать библу больше уже не нужно.
Последний раз редактировалось arthur2 19.01.2011 (Ср) 13:11, всего редактировалось 1 раз.
Артур
 
   

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 13:08

arthur2 писал(а):
Денис писал(а):после ключевого слова Lib требуется обязательно указать строку-константу
в которой допустимы относительные пути :)

При чем тут относительные пути? Если я говорю о том, что при позднем связывании юзер может добавить в файл ini любые дополнительные библиотеки лежащие возможно по разным путям.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 13:17

Денис писал(а):лежащие возможно по разным путям.
То есть, вообще где попало? что-то не очень представляю себе такую организацию плагинов. Плагины должны лежать в одной папке. Или - в разных подпапках одной папки.
Артур
 
   

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 13:19

arthur2 писал(а):То есть, вообще где попало?

К сожалению, ни программистам, ни их программам, юзеры ничего не должны. Эт я тебе как админ говорю.
Допустим, у нас в рабочей папке есть папка "Plugins"
Если в ней все плагины свалены в одну кучу, то доступ (при раннем связывании) мы получим примерно так:
Код: Выделить всё
Declare Sub mfunc Lib "Plugins\lib1.dll" ()

Но если плагины организованы в подпапки, каждый со своим описанием, вспомогательными папками итд. То тогда как?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 13:26

Денис писал(а):К сожалению, ни программистам, ни их программам, юзеры ничего не должны.

Поиск плагинов где попало можно осуществить хоть c Declare, хоть с CreateObject - не вижу принципиальной разницы. Другое дело, что ни в том ни в другом случае я бы не стал обеспечивать программу такой возможность, потому что
arthur2 писал(а):Плагины должны лежать в одной папке.

А юзер, конечно, ничего не должен - это программа должна перенести их в специально для плагинов предназначенную папочку. Или - ещё правильнее - инсталлятор.
Артур
 
   

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 13:29

arthur2 писал(а):не вижу принципиальной разницы.

Да ну как же так?
Код давай. Я не верю.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 13:44

Денис писал(а):Если в ней все плагины свалены в одну кучу, то доступ (при раннем связывании) мы получим примерно так:
Код: Выделить всё
Declare Sub mfunc Lib "Plugins\lib1.dll" ()

Но если плагины организованы в подпапки, каждый со своим описанием, вспомогательными папками итд. То тогда как?

Вероятно, так:
Код: Выделить всё
Declare Sub mfunc Lib "Plugins\plug1\lib1.dll" ()
:lol: :lol:
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 13:50

Артур писал(а):не вижу принципиальной разницы.
Артур писал(а):И кстати по-моему (поправьте, если это не так), после первого вызова функции искать библу больше уже не нужно.
Денис писал(а):Код давай. Я не верю.
Если моё предположение не верно - то да, вижу разницу. Но если верно - не вижу смысла выкладывать очевидный код.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 19.01.2011 (Ср) 14:00

Денис, с помощью Declare, пусть и не самым красивым путём, можно загрузить любую DLL, важно только придерживаться правила «каждому плагину — своё папка, каждому плагину — одинаковое имя DLL».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 14:12

arthur2 писал(а):программа должна перенести их в специально для плагинов предназначенную папочку. Или - ещё правильнее - инсталлятор.

Правильно, а в ней папочки: Plug1, Plug2, Plug3. Хорошо, допустим наш инсталлятор установил прогу с тремя предустановленными нами же плагинами. При этом он нам еще и перекомпилировал программу так, что статически привязал ее к этим трем папкам.
И что дальше? Юзер решил установить сторонний плагин. И что ему делать?
arthur2 писал(а):И кстати по-моему (поправьте, если это не так), после первого вызова функции искать библу больше уже не нужно.

А вот тут я не вижу разницы. В случае с ранним (статическим) связыванием мы все равно на каждый устанавливаемый плагин будем вынуждены объявить пачку Declare. В случае с поздним (динамическим) связыванием, мы просто будем по мере необходимости подсовывать в вызов LoadLibrary нужный путь из конфигурационного файла (или даже в CreateObject, если мы пишем ActiveX плагин).
arthur2 писал(а):Если моё предположение не верно - то да, вижу разницу. Но если верно - не вижу смысла выкладывать очевидный код.

В том то и дело, что код очевидный, и показывает невозможность организовать плагины ранним связыванием без перекомпиляции. Поэтому я предположил, что ты знаешь некий другой вариант кода.

Денис, с помощью Declare, пусть и не самым красивым путём, можно загрузить любую DLL, важно только придерживаться правила «каждому плагину — своё папка, каждому плагину — одинаковое имя DLL

Я только что описал этот самый путь. Надеюсь, более менее правильно. Он имеет смысл для open-source-проектов, которые могут перекомпилировать себя самостоятельно, как тот же Lazarus.
В VB с помощью Declare писать плагины это - извращение.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 19.01.2011 (Ср) 14:14

Денис писал(а):В том то и дело, что код очевидный, и показывает невозможность организовать плагины ранним связыванием без перекомпиляции. Поэтому я предположил, что ты знаешь некий другой вариант кода.

Хватит нести чушь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 14:18

:shock: Ну ладно. Хватит, так хватит.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: VisualBasic + WinAPI

Сообщение arthur2 » 19.01.2011 (Ср) 15:11

Не, ну при чем здесь перекомпиляция? :shock: Под очевидным кодом я имел ввиду код смены текущей директории.
Артур
 
   

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

Сообщение Денис » 19.01.2011 (Ср) 16:07

arthur2 писал(а):Не, ну при чем здесь перекомпиляция? :shock: Под очевидным кодом я имел ввиду код смены текущей директории.


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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: VisualBasic + WinAPI

Сообщение Хакер » 19.01.2011 (Ср) 16:08

Денис писал(а):Но как это проверить, если под рукой нет бейсика (у меня).

Не надо это проверять. 1000 раз это уже проверили, о чём тебе здесь и твердили.

Правда вызвать получится только один раз, потом хоть заменяйся текущую директорию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 59

    TopList