Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / вызов функций из сишной dll / 11 сообщений из 11, страница 1 из 1
17.11.2010, 09:55
    #36960943
lints
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
Есть сишное описание функции находящейся в dll:
int ispSerialize (int memory, ULONG addr, LONG64 sn, UCHAR snBase, string format)

Как правильно ее описать для вызова в VBA? Сколько ни пробовал - при попытке выполнения проект вываливается с ошибкой приложения...

В Access описываю так:
Private Declare Function ispSerialize Lib "AtJniIsp.dll" (ByVal memory As Integer, ByVal addr As Long, ByVal SN As Currency, ByVal snbase As Byte, ByVal format As String) As Integer

dll готовая, поменять формат вызова возможности нет
...
Рейтинг: 0 / 0
17.11.2010, 11:11
    #36961115
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
Никак. VBA не поддерживает как минимум LONG64.
...
Рейтинг: 0 / 0
17.11.2010, 11:14
    #36961120
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
> Автор: lints
> Есть сишное описание функции находящейся в dll:
> int ispSerialize (int memory, ULONG addr, LONG64 sn, UCHAR snBase, string format)

Это не полное описание декларации. Нет квалификатора соглашения о вызовах.

> Как правильно ее описать для вызова в VBA? Сколько ни пробовал - при попытке выполнения проект вываливается с
> ошибкой приложения...

В VBA можно вызвать функцию только если функция квалифицированна как stdcall.

> dll готовая, поменять формат вызова возможности нет

Как вариант, можно написать прокси dll с правильным квалификатором которая, будет вызыватся из VBA и просто вызывать
нужную тебе.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
17.11.2010, 11:30
    #36961155
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
lints,

1) Соглашения вызова?
2) Если прям так и написано - string, и string этот STL-овский, то с такой dll могут быть проблемы даже у других программ на C++, так как они могут использовать другую реализацию STL. Это, скажем так, индусский код. Если деваться некуда, то придётся разбираться с реализацией string в данной версии STL.


Antonariy,
64-битный целый как раз Currency (правда, signed).


Игорь Горбонос,
можно и с __cdecl, но кружным путём.
...
Рейтинг: 0 / 0
17.11.2010, 12:55
    #36961412
lints
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
Игорь ГорбоносВ VBA можно вызвать функцию только если функция квалифицированна как stdcall.

Другие функции из этой dll работают (правде в них нет LONG64 и string). Функции в которых строки передаются типа "char * deviceName" работают нормально.

В каких-то попытках эта функция не вываливалась с закрытием программы, но строковый параметр она не воспринимала. Значит основные проблемы именно с типом string - как его описать в VB?
...
Рейтинг: 0 / 0
17.11.2010, 13:08
    #36961464
lints
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
Игорь Горбонос> int ispSerialize (int memory, ULONG addr, LONG64 sn, UCHAR snBase, string format)

Это не полное описание декларации. Нет квалификатора соглашения о вызовах.

Это описание из описания функций dll.

Есть пример использования на си. Там описание такое:
ATJNIISP_API int STDCALL ispSerialize(int memory, ULONG addr, LONG64 sn, UCHAR snBase, string format);

Нигде нет описания в какой кодировке передавать строки - анси или уникод.

Есть подозрение, что в dll используется анси - dll буржуйская и функции открытия файлов не роботают с путями где есть русские буквы.
...
Рейтинг: 0 / 0
17.11.2010, 14:23
    #36961703
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
lints,

Atmel "отожгла", конечно :(

Попробуй так:
Код: plaintext
1.
2.
3.
Private Declare Function ispSerialize Lib "AtJniIsp.dll" ( _
   ByVal memory As Long, ByVal addr As Long, ByVal SN As Currency, _
   ByVal snbase As Byte, ByVal format_npos As Long, ByVal format As String, _
   ByVal format_len As Long, ByVal format_res As Long) As Long
Передавать format_npos = -1, format_len = Len(format), format_res = Len(format).
...
Рейтинг: 0 / 0
17.11.2010, 15:02
    #36961831
lints
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
БенедиктПопробуй так:
Код: plaintext
1.
2.
3.
Private Declare Function ispSerialize Lib "AtJniIsp.dll" ( _
   ByVal memory As Long, ByVal addr As Long, ByVal SN As Currency, _
   ByVal snbase As Byte, ByVal format_npos As Long, ByVal format As String, _
   ByVal format_len As Long, ByVal format_res As Long) As Long
Передавать format_npos = -1, format_len = Len(format), format_res = Len(format).

Программа перестала вылетать с ошибкой. Функция отрабатывает. Только она все равно не воспринимает параметр format. Что бы там не передал, результат оди и тот же - записывает номер в уникоде, а мне нужно число (format ="NUMBER"). И не совсем понятно какой номер она записывает?
...
Рейтинг: 0 / 0
17.11.2010, 15:26
    #36961913
lints
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
C номером вроде бы все нормально, просто он пишет символами уникодовскими шестнадцатиричное представление. Как заставить писать просто шестнадцатеричные числа, а не символы.
...
Рейтинг: 0 / 0
17.11.2010, 15:36
    #36961940
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
lints,

Раз функция стала вызываться и отрабатывать, значит угадан размер внутренней структуры string - 16 байт. Где в этой структуре указатель на строку, вопрос реализации STL. Попробуй попереставлять format внутри группы параметров format_npos - format - format_len - format_res со второй позиции на другие.
...
Рейтинг: 0 / 0
17.11.2010, 20:40
    #36962623
lints
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов функций из сишной dll
Бенедикт,

Уррррррррааааааа, все заработало.... :) Перестановка не нужна. От этого только опять вылетать начало.

У меня осталось от экспериментов декларация
dim format as string * 20

оставил
dim format as string

и все заработало.....

Правда пришлось еще поразбираться с currency, так как он передается умноженным на 10000.

Огромное всем спасибо, особенно Бенедикту :)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / вызов функций из сишной dll / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]