Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
farique
1

Подключить DLL, передать ей команду (строку) и получить ответ

30.08.2011, 10:42. Показов 5891. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Никогда не писал на vba, но понадобилось решить задачу. Сегодня столкнулся с проблемой.
Суть задачи: подключить DLL, передать ей команду (строку) и получить ответ. Обмен строками в utf-8.

Решил действовать в "лоб".
1) Подключил dll, описал функцию.
Visual Basic
1
2
Private Declare Function SendFunc Lib "somelib.dll" _
    (ByVal lpMess As Long) As Long
2) Далее стал передовать в функцию

Visual Basic
1
2
3
4
5
Dim str As String
Dim pAns As Long
 
str = "some text"
lpAns = SendFunc(StrPtr(str))
Обратно получаю ответ (ответ тоже идет в utf-8), используя: (нашел в интернете)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Function PointerToString(lngPtr As Long) As String
   Dim strTemp As String
   Dim lngLen As Long
 
   If lngPtr Then
      lngLen = lstrlenW(lngPtr) * 2
     If lngLen Then
         strTemp = Space(lngLen)
         CopyMemory strTemp, ByVal lngPtr, lngLen
         PointerToString = Replace(strTemp, Chr(0), "")
      End If
   End If
End Function
В итоге возникает проблема. 1. Библиотека говорит, что посылаемые мною команды неверны, хотя они верные. Я думаю, что это из-за кодировки. 2. Возвращаемое значение читается, но порой "выскакивают" лишние символы. Я думаю, что это тоже из-за кодировки.
Есть ли у вас какие-нибудь идеи? Где копать?
Как правильно преобразовывать строку в указатель и обратно? И как кодировать в utf8?

Добавлено через 2 минуты
Простите за название) Надо было назвать "Строки, указатели и DLL "
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2011, 10:42
Ответы с готовыми решениями:

Отослать команду по RS-232 и получить ответ
Здравствуйте форумчане. Сразу оговорюсь, я не программист, но кое какие знания у меня есть. Так...

Cmd.exe, как получить ответ консоли на команду?
программа выполняет консольную команду через Process x = Runtime.getRuntime().exec("команда"); как...

Отправить команду в запущенную консоль windows (cmd) и получить ответ
Доброго времени суток. Требуется из своей программы отправить команду в запущенную консоль...

Как передать строку из c# в c++ dll
Собственно сабж. В c++ dll'ке идет прием на: extern "C" __declspec(dllexport) void...

5
Заблокирован
30.08.2011, 10:45 2
Цитата Сообщение от farique Посмотреть сообщение
Никогда не писал на vba
А почему ваш выбор пал именно на vba?
Visual Basic
1
lpAns = SendFunc(StrPtr(str))
(а объявлена не lpAns, а lpAns)

Про работу с подключением библиотек (кроме как щелчком в редакторе VBE), увы, ничего не скажу.
0
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
01.09.2011, 15:25 3
Лучший ответ Сообщение было отмечено как решение

Решение

Во вложенном файле можно не только поиграть в шахматы , но и посмотреть как VBA взаимодействует с DLL. Заодно можно оценить "интелект" библиотеки DLL , размером всего 40 КБ, который играет в шахматы за компьютер.. :black_eye.:
Вложения
Тип файла: rar Chess_64.rar (96.6 Кб, 325 просмотров)
4
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
01.09.2011, 23:04 4
а клево)))длл на чем писано? судя по new и delete похоже на ++
вба я так понимаю лишь используется для нескольких мбоксов и чтобы выдернуть функции в из библиотеки?
0
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
05.10.2011, 02:18 5
Цитата Сообщение от AzaKendler Посмотреть сообщение
а клево)))длл на чем писано? судя по new и delete похоже на ++
вба я так понимаю лишь используется для нескольких мбоксов и чтобы выдернуть функции в из библиотеки?
Где то так..
0
5612 / 1596 / 414
Регистрация: 23.12.2010
Сообщений: 2,392
Записей в блоге: 1
05.10.2011, 10:36 6
Скажи Farique , а функция CopyMemory задекларирована?
Visual Basic
1
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
0
05.10.2011, 10:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2011, 10:36
Помогаю со студенческими работами здесь

Передать в функцию из DLL указатель на строку
Как предать в функцию из DLL указатель на строку? Python from ctypes import * ldll =...

Как передать Http get запрос, вложить в него json с токеном и настройками и получить ответ
Здравствуйте, подскажите, уже поломал голову, на Node Js получается, обычные запросы тоже принимаю,...

Как кодом подключить DLL и получить класс описанный в ней?
Есть ActiveX-dll с необходимым мне классом. Сейчас доступ к классу я получаю обьявив в свойствах...

задание, где в командную строку надо ввести арифметическое выражение (x+y-z*z) и получить ответ
Вводится строка символов (не более 50), представляющая собой запись выражения с целочисленными...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru