Страница: 1 |
Страница: 1 |
Вопрос: Как вызвать cdecl-функцию?
Добавлено: 16.09.04 17:08
Автор вопроса: Flora | Web-сайт:
Собственно САБЖ. Есть библиотека dll, надо вызвать содержащуюсю в ней функцию, а она требует декларацию cdecl, которую VB не поддерживает. Какие есть обходные варианты? Хорошо бы примерчик. Про callproc.dll - знаю. Но информации очень мало. Поможите кто знает.
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 16.09.04 20:08
Это не имеет значения. CDECL - это соглашение о передаче параметров.
Номер ответа: 2
Автор ответа:
Flora
ICQ: 324440101
Вопросов: 1
Ответов: 2
Web-сайт:
Профиль | | #2
Добавлено: 16.09.04 23:09
Что ЭТО? Я знаю что такое соглашение. И почему VB его не поддерживает. Конкретные советы есть?
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 17.09.04 00:18
CDECL (или STDCALL) - это такое соглашёние, при котором параметры складируются в стек в обратном порядке. Т.е. сначала последний, затем предпоследний и т.д.
Номер ответа: 4
Автор ответа:
Flora
ICQ: 324440101
Вопросов: 1
Ответов: 2
Web-сайт:
Профиль | | #4
Добавлено: 17.09.04 09:22
Госпо-о-о-ди! VB поддерживает только декларацию stdcall. А функция в dll требует декларацию cdecl. Как это обойти.
Номер ответа: 5
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #5
Добавлено: 17.09.04 09:40
>>CDECL (или STDCALL)
C DECLARATION и STANDART CALL ... это разные вещи...
в STDCALL функция сама заботится об очистки стека а в CDECL программа должно об этом заботится... то бишь
push 0
push 0
call CDECL_FUNCTION
add esp, 8
push 0
push 0
call STDCALL_FUNCTION
можешь попробовать использовать ЛАСМ (я его никогда не использовал так что не надо спрашивать как +) автор чуть выше сидит)
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 17.09.04 11:21
Да, тупанул я.
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 17.09.04 11:25
Ассемблер можно скачать тут:
http://www.vbnet.ru/soft/softdownload.asp?id=29
А почитать тут:
http://basicproduction.nm.ru/ASM/LASM/LASMLIGHT.html
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 17.09.04 11:33
Fallout,
А что скажешь по поводу названия SLASM? Слыхал где такое?
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 17.09.04 12:06
Пишешь так:
CONST CDECL_FUNCTION EQU [EBP+8]
push 0
push 0
call CDECL_FUNCTION
add esp, 8
Вместо нулей подставь нужные числа.
Затем кликаешь "Делать BAS файл" в тулбаре. Открываешь созданный проект и подменяешь p1 на адрес Си-шной функции.
Sub Main()
Const HexCode As String = "5589E55356576A006A00FF550881C4080000005F5E5B89EC5DC21000"
Dim BinSource As String: BinSource = Hex2Bin(HexCode)
On Error GoTo ErrASM
 im p1 As Long, p2 As Long, p3 As Long, p4 As Long
p1 = CODEPTR(AddressOf Vb_MsgBox)
p2 = 0
p3 = 0
p4 = 0
MsgBox "FUNCTION RETURN: " & ExecuteCode(BinSource, p1, p2, p3, p4)
Exit Sub
ErrASM:
MsgBox "VB found error in machine code", 48
Resume Next
End Sub
Номер ответа: 10
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #10
Добавлено: 17.09.04 14:30
про SLASM не слышал а вот LASM уже существует довно это Light Macro Assembler вот...
сделал один японец если интерестно то вот
www.tamasoft.co.jp/lasm/index-e.html
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 17.09.04 15:16
Я знаю. Жалко только что он имя занял. Оно у него фонарное, а у меня как раз в тему - Local Assembler