Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.0.89] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Можно ли в VB использовать асемблеровские вставки?
|
Сообщ.
#2
,
|
|
|
Цитата miksayer @ 15.11.04, 12:47 Можно ли в VB использовать асемблеровские вставки? Вроде не маленький уже. Должен и сам знать... |
Сообщ.
#3
,
|
|
|
я нашел вот такое:
Цитата Суть метода заключается в том, чтобы хранить уже скомпилированный код в виде константы. Каким образом это реализуется? Ниже приведена измененная мною выдержка из кода с моими пояснениями. Листинг – пример использования хранимых функций 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, но я не знаю! |
Сообщ.
#4
,
|
|
|
Это нереально! Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc...
|
Сообщ.
#5
,
|
|
|
хммм очень даже ничего мысля.
вот только нужно мозгами раскинуть как это будет выглядеть... |
Сообщ.
#6
,
|
|
|
Цитата Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc... а вообще реально такой адд-ин написать? |
Сообщ.
#7
,
|
|
|
Если поднатужиться и время найти бы, то может и реально.
У кого нибудь есть простинкая библиотека на асме, буквально 2+2? и чтоб результат верНула? Идея посетила меня... Добавлено перевести написаный код допустим в: ' #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 по сути дела не проблема. Проблема как и куда это дописать. Есть варианты такие, делать как выше сказано, хранить уже хекс в константе, либо делать так: допустим есть функция Public Function TestAsm(a as Integr, b as Integer) 'и тут писать вставку на асме End Function потом вставка компилируется асмом, создается dll'ка и дописывается по этому адресу. Но здесь есть большое НО... Где гарантия что адреса совпадут? Т.е. вызов функции VB и фнкции ASM Dll могут иметь не много разные значения. Или в этой функции (VB) положить константу с хексом функции на асме... Но не знаю тут просто нужно подумать как следует. Добавлено Хммм ребят а обязательно ее вшивать? может рядом положить? |
Сообщ.
#8
,
|
|
|
)) Мне удалось интегрировать функции написаные на Visual C++, откомпилировать, и записать блиотеку. Пока она лежит рядом.
Вот что касается асма, то мое маленькое достижение поможет писать на асме в среде Visual Basic т.к. всем известно что в С++ встроен асм.) Ввыглядит это примерно вот так: в модуле пишем: '#_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 Прописываем библиотеку тоже в каком-нибудь модуле: 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], 'таким образом можно создавать не сколько библеотек в одном модуле... и в кнопку пишем вот такую гадость 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 проекта, т.е. при нажатии на собственную кнопку начинается компиляция и запуск проекта. Не оставьте без совета... |
Сообщ.
#9
,
|
|
|
maxim84_, ну это не асм вставки - это исп. длл с асмом
|
Сообщ.
#10
,
|
|
|
Компилировать модули с ASM функциями PowerBasic компилятором.
PS Это только мысль, ничем не подтвержденная и не проверенная. |
Сообщ.
#11
,
|
|
|
SCINER, а я уж хотел спросить... Работает ли?
|
Сообщ.
#12
,
|
|
|
Простите за мою темнату в зании PB, а он умеет компелировать асем?
Цитата maxim84_, ну это не асм вставки - это исп. длл с асмом А пример приведеный выше разве не является примером использования dll с асмом? я просто не смог вырезать вункцию из скомпелированной dll'ки и вставить ее в .exe! |
Сообщ.
#13
,
|
|
|
maxim84_, Ладно, старался на +
|
Сообщ.
#14
,
|
|
|
Приколитесь, даже в батнике реально забацать библиотеку.
Юзать так: Private Declare Sub Function1 Lib "dll.dll" () Private Sub Command1_Click() Function1 End Sub Прикреплённый файлbat.dll.zip (2.17 Кбайт, скачиваний: 107) |
Сообщ.
#15
,
|
|
|
SCINER, Я чето непонял... там асм в bat файле???
|