На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
Страницы: (9) 1 [2] 3 4 ...  8 9 все  ( Перейти к последнему сообщению )  
> Как создать API DLL из VB , Матрица прогнулась под нами
    В DLL можно использовать только модули (нет классов и форм, почему-то при их вызове прога вызвавшая функцию рушится).

    Возможности:
    ExpandedWrap disabled
      Экспорт функций по ординалу^
      Создание консольных приложений
      Минимальный размер программы 5 кб
      Автодобавление функций DllMain и Main (опционально)
      Создание *.map файла (опционально)
      Переключение языков (русский/английский)


    12.08.2004
    Добавилась возможность создания консольных приложений (пример есть в архиве)
    автор примера Lamerroot

    13.08.2004
    В опциях добавилась возможность уменьшать размер любого компилируемого объекта.
    Пустая экзешка теперь весит 5 кб!

    18.08.2004
    Приношу свои извинения. Но в последней версии Alex221(особоая благодарность за помощь) обнаружил серьезный баг не позволявший компилировать DLL-файлы.
    Ссылка на скачивание обновлена.

    Принимается помощь по переводам на различные языки.
    Языки хранятся в виде строк с раздилителями в ресурсах файла vb_dll.dll.

    Качать (Последнее обновление 2 декабря 2006г.):
    (предыдущее обновление 18 Августа 2004г.):
    Сообщение отредактировано: SCINER -

    Прикреплённый файлПрикреплённый файлvb_dll.rar (27.73 Кбайт, скачиваний: 3791)
      Цитата
      Я решил проверить стабильность. Создал DLL в VB (с функцией работающей с потоками)и начал вызывать процедуру из других языков таких как VC, Delphi, PowerBasic, ну и из самого VB конечно. При данном тестировании не было замечено ни одного признака нестабильности. Все отработало как часы.

      Я как раз сказал, что с потоками библиотека работает нормально. Ты попробуй там СОМ-объекты посоздавать побольше. Приколешься.
      Цитата
      1. Ключ /DEBUG не действует по той причине, что эта самая отладочная инфа уже лежит в .obj файле, созданная компилятором.

      Я это и сказал.
      Цитата
      2. Ты утверждаешь, что такие функции, как __adjust_fdiv или __vbaR8IntI2 экспортируются с кодом. Плюс к тому они еще в составе какого-то интерфейса и экспортируются в EXE. Попробуй, загляни в msvbvm. Все сомнения насчет этого отпадут разом! Там фугкции именно так и называются. Не может быть такого, чтобы он таскал за собой msvbvm да еще и в себя их копировал. В этом случае экзешник был бы похож на дельфийский.

      Ну я же не говорил, что вот прямо полностью весь код всех ф-ий в ЕХЕ переноситься. Зато вот виртуальное объявление этих ф-ий как членов класса в ЕХЕ есть точно + какие-то ф-ии точно экспортируются полностью.
      Цитата
      3. Пишешь, что главная процедура небесполезная. Это частично так. По ним можно ориентироваться создавать или уничтожать классы. Ну какая может идти речь о классах в модулях. В этой функции только одно полезно. С помощью нее можно посмотреть кто тебя вызвал и решить позволять ему пользоваться твоими функциями или нет. Вот и вся прелесть.

      Ну, это совсем не мало.
      Цитата
      4. Все верно. Кстати, а может по этому мап файлу может вырезать ненужные блоки. Например, блок и ресурсами о версии DLL.

      Не я пробовал. Они находятся в другом сегменте данных. ВБ их не видит, как членов кода, т.е. откомпилировать проект будет невозможно. Мапфайл это чисто логи линковки. Ресурсы о версии можно удалить в последствии уже из готовой ДЛЛ стандартными АПИ или прикладной прогой, а так не знаю даже.
      Цитата
      5. Я очень неаккуратно работал с Copymemory с блоками по 60 мег. Ничего страшного не происходило. Все стабильно. Ресурсы не глючат (тестировал на Win9X, Win2000, WinXProHome). Да и вообще действуют все те же правила, что и в простой VB-пограмме.

      Причем тут CopyMemory? Я говорю про GlobalAlloc, VirtualAlloc, HeapAlloc и т.д.
      Цитата
      6. ... т.к. DLL находится не в адресном пространстве вызвавшей ее программы.

      Та конечно, а где она, по-твоему, тогда находится? Любая библиотека динамической компоновки загружается в адресное пространство процесса, который её вызвал (это на уровне ОС). Так что ты шутишь.
        to SCINER:

        К сожалению никак не могу заставить работать твой AddIn.
        DLL не компилируются, при запуске компиляции появляется
        месанджбокс "Bad file name or number". У меня на вижул студии
        стоит 6 сервис пак. Может из-за этого?
          Цитата SCINER @ 17.08.04, 09:21
          А как ты его устанавливал.
          Соблюдал ли все шаги описанные в ридми ?

          Стоит софт Visual Studio 6 SP6, Windows2000 build 5.00.2195 SP4.
          Addin устанавливал по инструкции, консольные программы компилируются
          нормально.При попытке копиляции тестового прожекта DLL.VBP появлялся
          месенджбокс "Bad file name or number". Деинсталлировал Addin,
          переустановил VS и SP6, заново установил Addin. Ура! Заработала.
          DLL наконец появилась. Компилирую Проверка.vbp, запускаю. Жму
          на кнопочку ADD появляется сообщение об ошибке:

          "Run-time error 453. Can`t find DLL entry point ADD in dll"

          Натравливаю на эту DLL "Stud_PE Analizator", он показывает
          девственно чистый раздел экспорта...

          "Number of exported Functions - 0"

          Абыдно понимаешь... Очень хочется нормальные DLL на VB писать..
          :(
            Это мой глюк, точно!

            Надо было так:
            VBInstance.ActiveVBProject.BuildFileName

            а я написал так:
            VBInstance.ActiveVBProject.Name

            В результате заместо c:\progman\vb\dll\mydll.vbd
            в линкер посылалось mydll.vbd

            разница очевидна :ph34r:

            Это только в последней версии, седня обновлю!
              SCINER:
              Цитата
              Я так понял, что ты имел в виду про обход стандартной процедуры точки входа. Если так, то да. Но. Я решил проверить стабильность. Создал DLL в VB (с функцией работающей с потоками)и начал вызывать процедуру из других языков таких как VC, Delphi, PowerBasic, ну и из самого VB конечно. При данном тестировании небыло замечено ни одного признака нестабильности. Все отработало как часы.
              Её и не должно было быть. Какая разница, как называется эта функция? VB её даже не экспортирует (да и зачем?).

              Цитата
              1. Ключ /DEBUG не не действует по той причине, что эта самая отладоная инфа уже лежит в .obj файле, созданная компилятором.
              Народ, вы что, думаете, что линкер просто "соединяет" obj-файлы и прописывает заголовок? Если отладочная инфа есть в obj'е, то это не значит, что она должна попасть в EXE-шник/DLL-ку. Линкер сам выбирает, что ему кидать в EXE-шник из obj'а, а что нет.

              Цитата
              В этой функции только одно полезно. С помощью ние можно посмотреть кто тебя вызвал и решить позволять ему пользоваться твоими функциями или нет. Вот и вся прелесть.
              А также удаление временных файлов, восстановление каких-то параметров, сохранение установок и т.д... в зависимоти от задач модуля :)

              Цитата
              Сорри. Минимальный размер экзешек 5120 байт!!!, т.е. 6кб!
              Гы! А если создать в VB обычный пустой проект, скомпилить и упаковать UPX'ом, то он тоже будет 5120 байт :D

              Lamerroot:
              Цитата
              5. Лучше вообще не пользоваться в этой библиотеке такими ф-иями как New и CreateObject, т.к. создание любого объекта, размер данных которого превышает размер стека, т.е. 64 кб, приведет к краху приложения. Так же надо очень аккуратно проводить операции по копированию блоков памяти и выделению места в адресном пространстве процесса.
              Может, я торможу, но что-то я не понял, причём тут стек? И причём тут 64kb, когда размер стека растягивается до метра?

              Цитата
              Та конечно, а где она, по-твоему, тогда находится? Любая библиотека динамической компоновки загружается в адресное пространство процесса, который её вызвал (это на уровне ОС). Так что ты шутишь.
              :yes:

              p.s. Кстати, ничего, что...
              1. При первом запуске после установки add-in'а VB выдал мне мессагу: "Method '~' of object '~' failed." ?
              2. Пункт "Компиляция" появился не сразу, а после того, как я нажал на "Make DLL"
              3. Frame "Настройки компиляции" (со всем содержимым) не... эээ... англифицируется :)
              4. При создании проекта выбрал "DLL", увидел функции DLLMain и Main (зачем, кстати, вторая?). Решил откомпилить, но нашёл только Make EXE. Подумал, вдруг так и надо. Откомпилил. Файл по-прежнему EXE. Заглянул внутрь. Файл не-DLL. Так, в чём прикол-то?
                Еще вопрос по консольным приложениям.
                К примеру, хочу я написать прогу типа FAR`а. С текстовым интерфейсом.
                Ну и мне нужно обрабатывать события в консоли. Нажатие клавишь, мышь и т.п.
                Как реализовать обработку событий в консольном окне?
                Вопрос довольно интересный...
                  Цитата
                  p.s. Кстати, ничего, что...
                  1. При первом запуске после установки add-in'а VB выдал мне мессагу: "Method '~' of object '~' failed." ?
                  2. Пункт "Компиляция" появился не сразу, а после того, как я нажал на "Make DLL"
                  3. Frame "Настройки компиляции" (со всем содержимым) не... эээ... англифицируется
                  4. При создании проекта выбрал "DLL", увидел функции DLLMain и Main (зачем, кстати, вторая?). Решил откомпилить, но нашёл только Make EXE. Подумал, вдруг так и надо. Откомпилил. Файл по-прежнему EXE. Заглянул внутрь. Файл не-DLL. Так, в чём прикол-то?


                  Специально, форматнул винт, установил Win2000 и Win98 буду проверять!

                  Добавлено в :
                  Цитата Alex221 @ 18.08.04, 09:40
                  Еще вопрос по консольным приложениям.
                  К примеру, хочу я написать прогу типа FAR`а. С текстовым интерфейсом.
                  Ну и мне нужно обрабатывать события в консоли. Нажатие клавишь, мышь и т.п.
                  Как реализовать обработку событий в консольном окне?
                  Вопрос довольно интересный...

                  Цитата
                  Еще вопрос по консольным приложениям.
                  К примеру, хочу я написать прогу типа FAR`а. С текстовым интерфейсом.
                  Ну и мне нужно обрабатывать события в консоли. Нажатие клавишь, мышь и т.п.
                  Как реализовать обработку событий в консольном окне?
                  Вопрос довольно интересный...


                  Сам думай!

                  Добавлено в :
                  Все работает, не гони

                  Добавлено в :
                  Цитата Jin X @ 18.08.04, 09:29
                  SCINER:
                  Цитата
                  Я так понял, что ты имел в виду про обход стандартной процедуры точки входа. Если так, то да. Но. Я решил проверить стабильность. Создал DLL в VB (с функцией работающей с потоками)и начал вызывать процедуру из других языков таких как VC, Delphi, PowerBasic, ну и из самого VB конечно. При данном тестировании небыло замечено ни одного признака нестабильности. Все отработало как часы.
                  Её и не должно было быть. Какая разница, как называется эта функция? VB её даже не экспортирует (да и зачем?).

                  Цитата
                  1. Ключ /DEBUG не не действует по той причине, что эта самая отладоная инфа уже лежит в .obj файле, созданная компилятором.
                  Народ, вы что, думаете, что линкер просто "соединяет" obj-файлы и прописывает заголовок? Если отладочная инфа есть в obj'е, то это не значит, что она должна попасть в EXE-шник/DLL-ку. Линкер сам выбирает, что ему кидать в EXE-шник из obj'а, а что нет.

                  Цитата
                  В этой функции только одно полезно. С помощью ние можно посмотреть кто тебя вызвал и решить позволять ему пользоваться твоими функциями или нет. Вот и вся прелесть.
                  А также удаление временных файлов, восстановление каких-то параметров, сохранение установок и т.д... в зависимоти от задач модуля :)

                  Цитата
                  Сорри. Минимальный размер экзешек 5120 байт!!!, т.е. 6кб!
                  Гы! А если создать в VB обычный пустой проект, скомпилить и упаковать UPX'ом, то он тоже будет 5120 байт :D

                  Lamerroot:
                  Цитата
                  5. Лучше вообще не пользоваться в этой библиотеке такими ф-иями как New и CreateObject, т.к. создание любого объекта, размер данных которого превышает размер стека, т.е. 64 кб, приведет к краху приложения. Так же надо очень аккуратно проводить операции по копированию блоков памяти и выделению места в адресном пространстве процесса.
                  Может, я торможу, но что-то я не понял, причём тут стек? И причём тут 64kb, когда размер стека растягивается до метра?

                  Цитата
                  Та конечно, а где она, по-твоему, тогда находится? Любая библиотека динамической компоновки загружается в адресное пространство процесса, который её вызвал (это на уровне ОС). Так что ты шутишь.
                  :yes:

                  p.s. Кстати, ничего, что...
                  1. При первом запуске после установки add-in'а VB выдал мне мессагу: "Method '~' of object '~' failed." ?
                  2. Пункт "Компиляция" появился не сразу, а после того, как я нажал на "Make DLL"
                  3. Frame "Настройки компиляции" (со всем содержимым) не... эээ... англифицируется :)
                  4. При создании проекта выбрал "DLL", увидел функции DLLMain и Main (зачем, кстати, вторая?). Решил откомпилить, но нашёл только Make EXE. Подумал, вдруг так и надо. Откомпилил. Файл по-прежнему EXE. Заглянул внутрь. Файл не-DLL. Так, в чём прикол-то?

                  Все работает!
                  скачай последнее обновление
                    Я и не спорю, что работает (ты лучше повнимательнее почитай, что я написал, я там и не говорил, что не работает, просто есть замечания), но то, что я описал, я же не сам придумал.
                    Видимо, я просто не понял, как создать DLL-ку.
                    Запускаю VB, выбираю "DLL", открываю "modDLL"... ах вон что! Нужно через "компиляцию" компилить! А я-то думал, что стандартно :)

                    Добавлено в :
                    Неее, не всё так просто!
                    Теперь так. Запускаем VB (делаю всё параллельно написанию этого текста), выбираем "DLL", затем "modDLL", создаём Sub xyz():MsgBox "hi!":End Sub. File/Компиляция... тьфу, блин, забыл сохраниться... File/Save..., File/Компиляция. Выбираю функцию xyz, жму OK. Указываю файл (по умолчанию DLL.exe, кстати). DLL-ка скомпилена! Ура! А теперь проверим её. Жмём просмотр, поиск, "xyz"... найден, что радует. Делаем прогу, вызывающую процедуру. Запускаем. Ошибка. Так, через OllyDBG, модуль загрузили, адрес процедуры получили, call eax (заходим внутрь). Идём, идём... ошибень! Ладно, может, я накосячил? Делаем на Delphi procedure...external.... Запускаем. Опять всё нормально. Ok, лезем в файл через hiew. F8, F2, смотрим "File is DLL: YES". Хм... почему ж не работает? Почему не работает?
                    Чтоб не быть голословным, вот вам мой проект.
                    Прикреплённый файлПрикреплённый файлproject1.zip (26.15 Кбайт, скачиваний: 274)
                      Вообще, надо бы, чтоб всё было чётко при "стандартной" компиляции, если это возможно.
                      А то когда делаешь File/Make DLL.dll, делается exe-шник, без экспортов и т.д.

                      p.s. Кстати, если в dll-ке (имеется в виду вообще в исходнике) нет экспортируемых функций (DLLMain не в счёт), то это не значит, что она не имеет право на существование! К тому же, для чего нужна функция main?
                        Спасибо насчет 2-х советов по улучшению аддина.
                        Однако я проверив твою DLL был в шоке!
                        Раньше-то все работало...вроде

                        Я в дельфях не спец, но написал динамический вызов (может неправильно):

                        ExpandedWrap disabled
                          uses
                            Windows, SysUtils;
                           
                          //procedure xyz; stdcall; external 'dll.dll';
                           
                          var
                           hDll:longint;
                           pProc:pointer;
                           
                          begin
                            //xyz
                           
                          hDll := LoadLibrary('dll');
                          pProc := GetProcAddress(hDll, 'xyz');
                          hDll := CallWindowProc(pProc,0,0,0,0);
                          FreeLibrary (hDll);
                           
                          end.


                        но и с помощью него вылетает таже ошибка, однако тот-же код на VB работает четко:

                        ExpandedWrap disabled
                          Dim hDll As Long, pProc As Long
                          hDll = LoadLibrary("dll")
                          pProc = GetProcAddress(hDll, "xyz")
                          pProc = CallWindowProc(pProc)
                          FreeLibrary hDll


                        Что-же это может быть? :wall: :wall: :wall:
                          ExpandedWrap disabled
                            uses
                              Windows, SysUtils;
                             
                            //procedure xyz; stdcall; external 'dll.dll';
                             
                            var
                             hDll:longint;
                             pProc:procedure; {stdcall}; может быть надо поставить
                             
                            begin
                              //xyz
                             
                            hDll := LoadLibrary('dll');
                            pProc := GetProcAddress(hDll, 'xyz');
                            pProc;
                            FreeLibrary (hDll);
                             
                            end.
                            И что это за код? Всё равно он не работает.
                            Видимо, дело в том, что процедура в DLL вызывает что-то. Если MsgBox убрать, то будет всё нормально. Это какие-то MS VB-шные штучки...
                              Вы вообще мои посты читали? Я там про точку вхождения кое-что писал.
                              Попробуйте сдеалть так: Переименовать ф-ию DLLMain, скажем, в Entry. Ну и откомпилять файл с ключом /ENTRY:Entry. Msgbox должен работать. Или можно, к примеру, воспользоваться API ф-ией MеssageBox. Она будет работать. А вообще в таких ДЛЛ нет никакой пользы т.к. процедура "Set obj = New Obj" приводит к немедленному краху ВБ. Лучше уже делать всё на старом добром ВЦ.
                                А лучше во всем разобраться и довести все до ума
                                  Lamerroot, да, читали. И что с того? Почему при переименовании будет работать? Ты писал, что __vbaS вызывает разные функции, а затем Main, а если мы переопределяем точку входа, что будет вызываться только DLLMain или что-то ещё (которая уже ничего не вызывает... по идее в этом и должна быть проблема). Причём тут имя вообще?
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (9) 1 [2] 3 4 ...  8 9 все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0511 ]   [ 18 queries used ]   [ Generated: 3.10.24, 17:43 GMT ]