Вопрос: Можно ли из VB вызвать функцию С | Добавлено: 06.05.05 22:53 |
Автор вопроса: ![]() |
Имеется функция С доступа к DLL:
int MtConnect(const int handle,const char *server,const int port); Подскажите новичку, можно ли из VB вызвать эту функцию, как ее правильно определить и как передать параметры? Заранее спасибо. |
Ответы | Всего ответов: 22 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 06.05.05 23:02 |
private declare function MtConnect lib "dllname.dll" (byval handle as long, byval server as string, byval port as long) as long |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 06.05.05 23:24 |
Может, причем по-видимому VB самостоятельно определяет что функция не stdcall а cdecl, к примеру после вызова wsprintf, VB, аккуратно добавляет к регистру esp нужные байты... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 7 |
Профиль | Цитата | #3 | Добавлено: 06.05.05 23:44 |
Вот такой код
Option Explicit Dim handle As Long Dim port As Long Dim server As String Private Declare Function MtConnect Lib "mtapi.dll" (ByVal handle As Long, ByVal server As String, ByVal port As Long) As Long Private Sub Form_Load() handle = 1 server = "217.74.32.254" port = 1950 Dim iserr As Integer iserr = MtConnect(handle, server, port) End Sub Выдает: Bad DLL calling convention |
Номер ответа: 4 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #4 | Добавлено: 06.05.05 23:45 |
Добавление к esp нужных байтов не имеет отношения к cdecl или stdcall. Это делается для того, чтобы выравнять стек по границе дворда, что нужно для последующей корректной очистки стека. (wsprintf может принимать третьим операндом и байт и ворд и дворд). |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 06.05.05 23:59 |
Многоуважеемый HOOLIGAN, к вашему сведению функции по соглашений stdscall - выравнивают стек сами (RETN кол-во байт), по cdecl - это должна сделать вызывающая функция (в конце функции RETN, после вызова add esp, xxx).
К вашему сведению, wsprintf может принимать не три параметра а более, т.к. она подчиняется соглашению cdecl, и кол-во аргументов в ней - переменное. Так что давайте не будем умничать, а просто помолчим, иначе, чувствую, мне прийдется переубеждать кого-то в обратном, а лишних забот мне не надо... |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 07.05.05 00:01 |
2genadz, у мня такой длл вовсе нет ![]() |
Номер ответа: 7 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #7 | Добавлено: 07.05.05 00:03 |
genadz
Попробуй так: Private Declare Function MtConnect CDecl Lib "mtapi.dll" (ByVal handle As Long, ByVal server As String, ByVal port As Long) As Long P.S. О esp: попутал до и после вызова ![]() |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 7 |
Профиль | Цитата | #8 | Добавлено: 07.05.05 00:10 |
Попробовал, результат тот же |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 07.05.05 00:13 |
А что за библиотека, откуда декларация??? Ведет себя одинаково и в IDE и в откомпилированном виде ?? |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 7 |
Профиль | Цитата | #10 | Добавлено: 07.05.05 00:30 |
Декларация из описания использования DLL. Описание довольно большое, а как прицепить файл на этом форуме я не знаю. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 07.05.05 00:32 |
На форуме нельзя цеплять файлы ![]() |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 7 |
Профиль | Цитата | #12 | Добавлено: 07.05.05 00:44 |
Не нашел ничего лучшего как направить на e-mail. Помогите разобраться пожалуйста. |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 07.05.05 00:59 |
Описание - хорошо, но я же сказал - у меня самой библиотеки нет ![]() |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 7 |
Профиль | Цитата | #14 | Добавлено: 07.05.05 01:16 |
А это ссылка где лежит эта DLL с описанием и примерами использования на С http://www.alpari-idc.ru/files/mtapi.zip |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 07.05.05 01:51 |
2genadz, перреписывай полностью весь код а не кусками, инициализацию winsock, создание сокета, а не просто handle = 1, и пр.
Кста, при запуске откомпилированного exe у меня не происходит ошибки Bad Dll Conversion... |
|