На главную Наши проекты:
Журнал   ·   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.
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Ассемблеровские вставки
    Можно ли в VB использовать асемблеровские вставки?
      Цитата miksayer @ 15.11.04, 12:47
      Можно ли в VB использовать асемблеровские вставки?

      Вроде не маленький уже. Должен и сам знать... :)
        я нашел вот такое:
        Цитата

        Суть метода заключается в том, чтобы хранить уже скомпилированный код в виде константы. Каким образом это реализуется? Ниже приведена измененная мною выдержка из кода с моими пояснениями.

        Листинг – пример использования хранимых функций
        Private Const ASMCode As String = "5589E581EC780000005756538B5D0 ...” ‘шестнадцатеричное значение сильно сокращено с целью экономии места

        Call LoadMCodeFromString (MyFunc, ASMCode) ‘ вызов функции преобразования

        ‘ Так как VB по умолчанию передает параметры ByRef - мы получаем массив MyFunc
        Private Function LoadMCodeFromString(asm_code_ARRAY() As Byte, MCODE As String)
        Dim i As Long, aSize As Long
        aSize = Len(MCODE) ' размер кода
        Debug.Assert Not aSize And 1 ' число не может быть четным
        aSize = aSize \ 2
        ReDim Preserve asm_code_ARRAY(0 To aSize - 1) ' подготавливаем массив
        For i = 0 To aSize - 1
        asm_code_ARRAY(i) = Val("&H" & Mid$(MCODE, i * 2 + 1, 2)) 'создаем массив
        Next
        End Function

        ptMf = VarPtr(MyFunc(0)) ' получаем адрес первого элемента, он же и будет адресом нашей процедуры
        CallWindowProc pMf, ... параметры


        но мне нужно, чтобы можно было код на ассемблере использовать как в VC при помощи конструкции asm или ей подобной

        SCINER, но я не знаю!
          Это нереально! Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc...
            хммм очень даже ничего мысля.
            вот только нужно мозгами раскинуть как это будет выглядеть...:)
            Сообщение отредактировано: Vasya2000 -
              Цитата
              Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc...

              а вообще реально такой адд-ин написать?
                Если поднатужиться и время найти бы, то может и реально.
                У кого нибудь есть простинкая библиотека на асме, буквально 2+2? и чтоб результат верНула?
                Идея посетила меня...

                Добавлено
                перевести написаный код допустим в:
                ExpandedWrap disabled
                  ' #Asm
                  '  mov ecx, elemscount
                  '  jecxz @getout
                  '  mov edx, pArrData
                  '  xor eax, eax
                  '
                  '@start:
                  '  dec ecx
                  '  add eax, dword ptr [edx+ecx*4]
                  '  cmp ecx, 0
                  '  jne @start
                  '@getout:
                  ' #End Asm

                почему как коментарий ? Потому что если писать открыто то компилятор начнет материться как не нормальный.
                Этот кусок откомпелировать и загнать в .exe или .dll по сути дела не проблема.
                Проблема как и куда это дописать.
                Есть варианты такие, делать как выше сказано, хранить уже хекс в константе, либо делать так:
                допустим есть функция
                ExpandedWrap disabled
                   Public Function TestAsm(a as Integr, b as Integer)
                    'и тут писать вставку на асме
                   End Function

                потом вставка компилируется асмом, создается dll'ка и дописывается по этому адресу. Но здесь есть большое НО... Где гарантия что адреса совпадут? Т.е. вызов функции VB и фнкции ASM Dll могут иметь не много разные значения. Или в этой функции (VB) положить константу с хексом функции на асме...
                Но не знаю тут просто нужно подумать как следует.:yes:

                Добавлено
                Хммм ребят а обязательно ее вшивать? может рядом положить?
                Сообщение отредактировано: Vasya2000 -
                  :))) Мне удалось интегрировать функции написаные на Visual C++, откомпилировать, и записать блиотеку. Пока она лежит рядом.
                  Вот что касается асма, то мое маленькое достижение поможет писать на асме в среде Visual Basic т.к. всем известно что в С++ встроен асм.:))
                  Ввыглядит это примерно вот так:
                  в модуле пишем:
                  ExpandedWrap disabled
                    '#_CPP [DLL: CPP_DLL]
                    ' #include <windows.h>
                    ' #include <string.h>
                    ' #include <ole2.h>
                    ' BYTE _stdcall TestByte( BYTE a, LPBYTE b )
                    ' {
                    '     *b = a + a;
                    '     return( *b + a );
                    ' }
                    '#End _CPP

                  Прописываем библиотеку тоже в каком-нибудь модуле:
                  ExpandedWrap disabled
                     
                      Public Declare Function TestByte Lib "CPP_DLL.dll" (ByVal a As Byte, ByRef b As Byte) As Byte
                    ' Имя библеотеки CPP_DLL.dll потому что мы ввели параметр #_CPP [DLL: CPP_DLL],
                    'таким образом можно создавать не сколько библеотек в одном модуле...

                  и в кнопку пишем вот такую гадость
                  ExpandedWrap disabled
                    Private Sub Command1_Click()
                        Dim bytA As Byte
                        Dim bytB As Byte
                        Dim bytC As Byte
                        
                        bytA = 17
                        bytC = TestByte(bytA, bytB)
                        Print bytA, bytB, bytC
                    End Sub

                  И все работает.
                  Но не обошлось и без багов, т.е. нужно задержать компеляцию VB модулей, а то VC++ не успевает создать библеотеку и тут конечно вылезает ошибка. Если кото знает как отследить начало компиляции или как искуственно запустить начало компиляции VB проекта, т.е. при нажатии на собственную кнопку начинается компиляция и запуск проекта.
                  Не оставьте без совета...
                  Сообщение отредактировано: Vasya2000 -
                    maxim84_, ну это не асм вставки - это исп. длл с асмом :)
                      Компилировать модули с ASM функциями PowerBasic компилятором.
                      PS Это только мысль, ничем не подтвержденная и не проверенная.
                        SCINER, а я уж хотел спросить... Работает ли? :)
                          Простите за мою темнату в зании PB, а он умеет компелировать асем?

                          Цитата

                          maxim84_, ну это не асм вставки - это исп. длл с асмом


                          А пример приведеный выше разве не является примером использования dll с асмом?

                          я просто не смог вырезать вункцию из скомпелированной dll'ки и вставить ее в .exe!
                          Сообщение отредактировано: maxim84_ -
                            maxim84_, Ладно, старался на + :)
                              Приколитесь, даже в батнике реально забацать библиотеку.

                              Юзать так:

                              ExpandedWrap disabled
                                Private Declare Sub Function1 Lib "dll.dll" ()
                                 
                                Private Sub Command1_Click()
                                Function1
                                End Sub

                              Прикреплённый файлПрикреплённый файлbat.dll.zip (2.17 Кбайт, скачиваний: 107)
                                SCINER, :blink: :blink: Я чето непонял... там асм в bat файле???
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0451 ]   [ 15 queries used ]   [ Generated: 19.05.24, 22:57 GMT ]