VisualBasic + WinAPI

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: VisualBasic + WinAPI

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

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

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

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

Re: VisualBasic + WinAPI

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

Денис писал(а):Так это что же получается, Declare нельзя считать ранним связыванием?

Абсолютно недопустимо.

Денис писал(а):Получается, это связывание позднее, динамическое?

Это вообще никакое не связывание. Термин «связывание» оставим для, как миниумум ООП-а, а как максимум — COM-а. А у нас — импорт. Обычный и отложенный. Так вот Declare — это отложенный импорт.

Я это написал во втором посте этой темы. Стоило ли писать кучу постов с ерундой, чтобы потом всё-таки согласиться с написанным?..
—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 (Ср) 17:53

Денис писал(а):Получается, это связывание позднее, динамическое?
Насколько я понимаю термин "динамическое": раннее связывание и динамическое связывание - не есть противоположности. Вполне можно осуществить раннее динамическое связывание. И даже предпочтительнее - делать динамическое связывание именно ранним.
Артур
 
   

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: VisualBasic + WinAPI

Сообщение Vi » 20.01.2011 (Чт) 11:50

Хакер писал(а):Обычный импорт: нужная функция объявляется в TLB, TLB подключается к проекту. Вызывается как обычная функция.
Отложенный импорт: нужная функция объявляется с помощью Declare Sub/Function, почти так же, как обычная. Вызывается как обычная функция.

Эти импорты ведут себя одинаково. Более того Declare внутренним образом переводится в запись TLB.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: VisualBasic + WinAPI

Сообщение Хакер » 20.01.2011 (Чт) 13:02

Глупости говоришь.

Функция, импортируемая через TLB, импортируется через обычную таблицу импорта PE-файла. Для неё создаётся ячейка в IAT, для неё создаётся jmp-thunk, для её библиотеки создаётся дескриптор импорта в таблцие импорта. Её импорт обрабатывает системный загрузчик в ядре, и если библиотеки/экспорта он не найдёт, файл вообще не загрузится.

Функции, импортируемые через Declare Function, не попадают в обычную таблицу импорта, для них не создаётся ячейки IAT и дескриптора для её библитеки. Её импорт обрабатывает сама VB-шная программа, проверяя свой внутренний аналог таблицы импорта, нужную библиотеку подгружает (а затем ищет в ней экспорт с помощью GetProcAddress) код внутри msvbvm60!DllFunctionCall. При ненахождении библиотеки/экспорта выбрасывается ошибка, которую можно обработать в VB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: VisualBasic + WinAPI

Сообщение Vi » 20.01.2011 (Чт) 18:29

Хакер писал(а):Функция, импортируемая через TLB, импортируется через обычную таблицу импорта PE-файла. Для неё создаётся ячейка в IAT, для неё создаётся jmp-thunk, для её библиотеки создаётся дескриптор импорта в таблцие импорта. Её импорт обрабатывает системный загрузчик в ядре, и если библиотеки/экспорта он не найдёт, файл вообще не загрузится.

Подтверждаю. Я свой вывод сделал на основе запуска проекта. Пока не дошло до вызова метода приложение нормально работает. Я думал ,такое поведение сохранится и для генерируемого ЕХЕ-шника. Посыпаю голову пеплом.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: VisualBasic + WinAPI

Сообщение NashRus » 20.01.2011 (Чт) 19:24

Достойный ответ достойного специалиста.

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

Re: VisualBasic + WinAPI

Сообщение Хакер » 20.01.2011 (Чт) 19:26

Vi писал(а):до вызова метода

Метода? Я про функции, обычные, которые располагаются в модулях, а не являются членами кокласса с флагом APPGLOBAL.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: VisualBasic + WinAPI

Сообщение Vi » 21.01.2011 (Пт) 11:58

Хакер писал(а):Метода? Я про функции, обычные, которые располагаются в модулях, а не являются членами кокласса с флагом APPGLOBAL.

Я их не разделяю. В данном случае, метод - это функция, которая определена в ДЛЛ.
Код: Выделить всё
Private Sub Form_Click()
    Dim x() As Double, bs() As Double, p() As Double, p2() As Double
    Call A_BSCPP(0, x(), 3, bs(), 0, p(), p2())
End Sub

Reference=*\G{610B38D2-577F-11D6-A449-004095426E66}#1.0#0#D:\Projects\FLEXI\FlexiDll\FlexiDLL.TLB#FlexiDLL Library
Код: Выделить всё
[
   uuid(610B38D2-577F-11D6-A449-004095426E66),
   version(1.0),
   helpstring("FlexiDLL Library")
]
library FlexiDLL
{
   
   [
      uuid(610B38D3-577F-11D6-A449-004095426E66),
      dllname(".\FlexiDLL.DLL")
   ]
   module Flexi
   {
...
      [
         helpstring("Convert a spline in B-spline representation to piecewise polynomial representation (array version)"),
         entry("A_BSCPP")
      ]
      HRESULT stdcall A_BSCPP
      (
         [in]       long               KORDER,
         [in]      SAFEARRAY(double)   *   XKNOT,
         [in]       long               NCOEF,
         [in]      SAFEARRAY(double)   *   BSCOEF,
         [in,out]   long            *   NPPCF,
         [in,out]    SAFEARRAY(double)   *   PPBREAK,
         [in,out]    SAFEARRAY(double)   *   PPCOEF
      );

PS
FlexiDLL.TLB 3408 04.03.04 14:09
Это почему произошла досадная оплошность - ведь столько лет прошло.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: VisualBasic + WinAPI

Сообщение kiber_punk » 21.01.2011 (Пт) 12:56

Уфф.. :|

Так вот. Я же не просто так тему создал. Мне даже неведома сама конструкция объявления и вызова.

Продемонстрируйте пожалуйста простенький пример (из 5 строк) объявления и вызова MessageBox(A) из user32.dll через отложенный импорт (ИМЕННО КОД).
Заранее благодарю.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VisualBasic + WinAPI

Сообщение iGrok » 21.01.2011 (Пт) 13:20

kiber_punk писал(а):ИМЕННО КОД


Код: Выделить всё
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

Private Sub Form_Load
  MessageBox Me.hWnd, "Это текст", "Это заголовок", 0
End Sub
label:
cli
jmp label

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

Re: VisualBasic + WinAPI

Сообщение Денис » 21.01.2011 (Пт) 13:32

Vi писал(а):В данном случае, метод - это функция, которая определена в ДЛЛ.

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

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: VisualBasic + WinAPI

Сообщение Vi » 21.01.2011 (Пт) 13:39

kiber_punk писал(а):Так вот. Я же не просто так тему создал. Мне даже неведома сама конструкция объявления и вызова.
Продемонстрируйте пожалуйста простенький пример (из 5 строк) объявления и вызова MessageBox(A) из user32.dll через отложенный импорт ИМЕННО КОД.

Есть такая программка C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi\APILOAD.EXE. (Раньше она у меня была в меню Add-ins, но потом исчезла, так что привожу путь к ней для автономного запуска) Она позволяет много деклараций сделать с её помощью. Там рядом есть две базы WIN32API.MDB и WIN32API.TXT. Есть также описание.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: VisualBasic + WinAPI

Сообщение kiber_punk » 21.01.2011 (Пт) 17:09

Сам сидел разбирался, да и разобрался. Но я вижу уже ответили по существу. Спасибо, iGrok.
Ссылки ни одной никто не предложил, ну да ладно, всё самому приходится делать.
Работа с функциями Windows API и DLL

Visual Basic » Справочник по WinAPI

Visual Basic - Несколько слов об API, Win32, DLL

--------------------------------
Код: Выделить всё
Private Declare Function MessageBoxA Lib "user32" _
(ByVal Parent As Integer, ByVal msg As String, ByVal caption As String, ByVal Textype As Integer) As Long

Private Sub Command1_Click()
a = MessageBoxA(0, "test", "Caption", 0)
End Sub
Mea culpa

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

Re: VisualBasic + WinAPI

Сообщение kiber_punk » 21.01.2011 (Пт) 17:20

Есть такая программка C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi\APILOAD.EXE. (Раньше она у меня была в меню Add-ins, но потом исчезла, так что привожу путь к ней для автономного запуска) Она позволяет много деклараций сделать с её помощью. Там рядом есть две базы WIN32API.MDB и WIN32API.TXT. Есть также описание.

Спасибо за информацию, Vi!
Тулзу нашёл, но вот как её включить в меню? Перерыл все опции, но ни "Add-ins", ни "Configure tools" не нашёл.

Кто-нить знает?
Mea culpa

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

Re: VisualBasic + WinAPI

Сообщение arthur2 » 21.01.2011 (Пт) 19:29

kiber_punk писал(а):Ссылки ни одной никто не предложил, ну да ладно, всё самому приходится делать.
http://bbs.vbstreets.ru/viewforum.php?f=24
http://bbs.vbstreets.ru/viewtopic.php?f=24&t=11721
Артур
 
   

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: VisualBasic + WinAPI

Сообщение Vi » 24.01.2011 (Пн) 13:07

kiber_punk писал(а):
Тулзу нашёл, но вот как её включить в меню? Перерыл все опции, но ни "Add-ins", ни "Configure tools" не нашёл.
Кто-нить знает?

Попробовал подробно поиграться. Вот что получилось, хотя я и не понял всего механизма: меню "Add-Ins" -> "Add-In Manager...". В диалоге должен быть VB API Declaration Loader. Если есть, то загружаешь с нужными опциями. Если нет, то выбрать "VB 6 Add-In Toolbar" и загрузить его. После этого закрыть диалог - появится тулбар с иконкой +/-. Снова появится диалог, в котором я нашёл "VB API Declaration Loader". Ставишь крыжик и кнопка его запуска появляется на тулбаре.

PS
У меня после повторного запуска исчезло и оттуда.

PPS
APILOAD.EXE /regserver. Т.е. нужно зарегистрировать его. Тогда появится "VB 6 API Viewer" где нужно. И будет доступен после выбора в диалоге "Add-In Manager..." в виде пункта в меню "Add-Ins".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Lotreck
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 19.03.2008 (Ср) 14:59

Re: VisualBasic + WinAPI

Сообщение Lotreck » 25.01.2011 (Вт) 20:41

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

Дан Эпплман Для профессионалов "Win32 API и Visual Basic"

Пред.

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

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

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

    TopList