Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 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-сайт: hw.t-k.ru
 Профиль | | #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
declare function MtGetPrices lib "где она там.dll" (byval handle as long, byval symbol as string, byval lots as long, byref bid as double, byref ask as double) as long
.....

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-сайт: sur.hotbox.ru/
 Профиль | | #22
Добавлено: 11.05.05 18:25
Как видно в исходнике dll, эта штука не имеет интерфейса для работы через VB (не COM обьект). Нужно разбираться с исходником, писать враппер...
Поищи в инете - может уже написал кто...

ЗЫ Мне, иногда, было достаточно прописать __stdcall в декларациях dll, перекомпилить и уже можно было работать, но думаю, тут не тот случай. Пардон, я в С# чайник.

Ответить

Страница: 1 | 2 |

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



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