Страница: 1 | 2 |
Вопрос: Можно ли из VB вызвать функцию С
Добавлено: 06.05.05 22:53
Автор вопроса: genadz
Ответы
Всего ответов: 22
Номер ответа: 16
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #16
Добавлено: 07.05.05 04:37
По теме.
Функция переведена правильно, но она действительно cdecl.
С cdecl у VB весёлая проблема. Как-то я пытался сделать привязку к cdecl через написание простенькой tlb, содержащей module с указанием на нужную функцию и описанием её calling convention. VB подключил tlb, увидел функцию и согласился её вызвать. Более того, если откомпилировать такой экзешник, то функция прекрасно вызывается, а если его дизассемблировать, то видно, как после команды call идёт add esp, [сколько надо]. Но не обольщайтесь, тот же tlb-вызов из-под IDE просто рушит оную.
Так что можно, к примеру, написать tlb и забыть про отладку Или - как всегда - юзать вызов функции через асмовый переходник. Впрочем, эти методики можно совместить через условную компиляцию... типа debug и release...
Номер ответа: 17
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #17
Добавлено: 07.05.05 09:52
Ах, да GSerg дельную мысль посдказал
ApiByNameEx в примерах дописана таким образом что может вызывать и cdecl и stdcall функции... Отвечает за сие параметр: bStackAdd.
Номер ответа: 18
Автор ответа:
genadz
Вопросов: 1
Ответов: 7
Профиль | | #18
Добавлено: 07.05.05 20:08
Большое спасибо за помощь, кажется заработала. А часто бывает что программа из IDE не работает а откомпилированная работает? А как определить такую функцию
int MtGetPrices( const int handle, const char *symbol, const int lots, double *bid, double *ask ); из той же DLL и получить bid и ask?
Номер ответа: 19
Автор ответа:
genadz
Вопросов: 1
Ответов: 7
Профиль | | #19
Добавлено: 07.05.05 21:14
Да и еще, функция MtConnect при вызове (после вызова MtCreate и передачи номера сокета) возвращает 2, что квалифицируется DLL как неопознаная ошибка. В чем может быть причина? Программа к интернету не обращается (видно по Outpost). Скорее всего неправильно передаются параметры.
Номер ответа: 20
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #20
Добавлено: 08.05.05 05:25
.....
dim b as double, a as double
MtGetPrices handle, "symbol", lots, b, a
Номер ответа: 21
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #21
Добавлено: 11.05.05 13:23
Я не раз сталкивался с подобной проблемой. Обходил следующим образом: грузил библиотеку через LoadLibrary, получал адрес функции через GetProcAddress и вызывал через CallWindowProc.
Попробуй вот так
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Dim mHandle As Long
Dim ProcAddress As Long
Private Sub Form_Load()
Dim Res As Long
Dim Server As String
Server = "217.74.32.254"
mHandle = LoadLibrary("mtapi.dll"
ProcAddress = GetProcAddress(mHandle, "MtConnect"
Res = CallWindowProc(ProcAddress, 1, StrPtr(Server), 1950, 0)
MsgBox Res
End Sub
Номер ответа: 22
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #22
Добавлено: 11.05.05 18:25
Как видно в исходнике dll, эта штука не имеет интерфейса для работы через VB (не COM обьект). Нужно разбираться с исходником, писать враппер...
Поищи в инете - может уже написал кто...
ЗЫ Мне, иногда, было достаточно прописать __stdcall в декларациях dll, перекомпилить и уже можно было работать, но думаю, тут не тот случай. Пардон, я в С# чайник.