powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / вызов функций из сишной dll
11 сообщений из 11, страница 1 из 1
вызов функций из сишной dll
    #36960943
lints
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть сишное описание функции находящейся в 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
вызов функций из сишной dll
    #36961115
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак. VBA не поддерживает как минимум LONG64.
...
Рейтинг: 0 / 0
вызов функций из сишной dll
    #36961120
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: 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
вызов функций из сишной dll
    #36961155
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lints,

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


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


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

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

В каких-то попытках эта функция не вываливалась с закрытием программы, но строковый параметр она не воспринимала. Значит основные проблемы именно с типом string - как его описать в VB?
...
Рейтинг: 0 / 0
вызов функций из сишной dll
    #36961464
lints
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос> 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
вызов функций из сишной dll
    #36961703
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
вызов функций из сишной dll
    #36961831
lints
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БенедиктПопробуй так:
Код: 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
вызов функций из сишной dll
    #36961913
lints
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C номером вроде бы все нормально, просто он пишет символами уникодовскими шестнадцатиричное представление. Как заставить писать просто шестнадцатеричные числа, а не символы.
...
Рейтинг: 0 / 0
вызов функций из сишной dll
    #36961940
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lints,

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

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

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

оставил
dim format as string

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

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

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


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