Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Как вызвать cdecl-функцию? Добавлено: 16.09.04 17:08  

Автор вопроса:  Flora | Web-сайт: www.flora.hoha.ru | ICQ: 324440101 
Собственно САБЖ. Есть библиотека dll, надо вызвать содержащуюсю в ней функцию, а она требует декларацию cdecl, которую VB не поддерживает. Какие есть обходные варианты? Хорошо бы примерчик. Про callproc.dll - знаю. Но информации очень мало. Поможите кто знает.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 16.09.04 20:08
Это не имеет значения. CDECL - это соглашение о передаче параметров.

Ответить

Номер ответа: 2
Автор ответа:
 Flora



ICQ: 324440101 

Вопросов: 1
Ответов: 2
 Web-сайт: www.flora.hoha.ru
 Профиль | | #2
Добавлено: 16.09.04 23:09
Что ЭТО? Я знаю что такое соглашение. И почему VB его не поддерживает. Конкретные советы есть?

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 17.09.04 00:18
CDECL (или STDCALL) - это такое соглашёние, при котором параметры складируются в стек в обратном порядке. Т.е. сначала последний, затем предпоследний и т.д.

Ответить

Номер ответа: 4
Автор ответа:
 Flora



ICQ: 324440101 

Вопросов: 1
Ответов: 2
 Web-сайт: www.flora.hoha.ru
 Профиль | | #4
Добавлено: 17.09.04 09:22
Госпо-о-о-ди! VB поддерживает только декларацию stdcall. А функция в dll требует декларацию cdecl. Как это обойти.

Ответить

Номер ответа: 5
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 17.09.04 11:21
Да, тупанул я. ;)

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 17.09.04 11:33
Fallout,
 А что скажешь по поводу названия SLASM? Слыхал где такое?

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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
    ;Dim 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-сайт: mudator.by.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 17.09.04 15:16
Я знаю. Жалко только что он имя занял. Оно у него фонарное, а у меня как раз в тему - Local Assembler

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам