Вопрос: как подключить чужую DLL?

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 09:53:00

Дано:
1. Имеется DLL, содержащая API для управления некой железкой;
2. Для этой DLL имеется враппер (еще одна DLL, надстройка) для dotNET, к которой имеются описания вызовов (их параметров и возвращаемых значений);
3. Имеется описание DLL с API (1), созданное с помощью DependencyWalker (ниже – взятый из него перечень экспортируемых фунций (процедур)).

Код: Выделить всё
     Import  Ordinal      Hint         Function           Entry Point
     ------  -----------  -----------  -----------------  -----------

     Export  Ordinal      Hint         Function           Entry Point
     ------  -----------  -----------  -----------------  -----------
     [C  ]    1 (0x0001)   9 (0x0009)  SMCGetOutput       0x00062FB0
     [C  ]    2 (0x0002)  14 (0x000E)  SMCSetOutput       0x00062F8C
     [C  ]    3 (0x0003)   5 (0x0005)  SMCGetInput        0x00062F30
     [C  ]    4 (0x0004)  11 (0x000B)  SMCGetTorque       0x00062ED4
     [C  ]    5 (0x0005)   4 (0x0004)  SMCGetDirection    0x00062E28
     [C  ]    6 (0x0006)   8 (0x0008)  SMCGetMoving       0x00062DCC
     [C  ]    7 (0x0007)  15 (0x000F)  SMCSetTorque       0x00062E80
     [C  ]    8 (0x0008)  16 (0x0010)  SMCStop            0x00062D80
     [C  ]    9 (0x0009)  12 (0x000C)  SMCMove            0x00062D10
     [C  ]   10 (0x000A)   2 (0x0002)  SMCDemo            0x00062CF4
     [C  ]   11 (0x000B)  13 (0x000D)  SMCSetDemo         0x00062CD0
     [C  ]   12 (0x000C)  10 (0x000A)  SMCGetOutputCount  0x00062C90
     [C  ]   13 (0x000D)   6 (0x0006)  SMCGetInputCount   0x00062C74
     [C  ]   14 (0x000E)   7 (0x0007)  SMCGetMotorCount   0x00062C58
     [C  ]   15 (0x000F)   1 (0x0001)  SMCConnected       0x00062CAC
     [C  ]   16 (0x0010)   3 (0x0003)  SMCDisconnect      0x00062B50
     [C  ]   17 (0x0011)   0 (0x0000)  SMCConnect         0x00062B70


Требуется подключить эту DLL к программе на FPC, используя имеющуюся информацию.

Поиск по форуму и в Интернете делал, но внятного и понятного (для тупого меня) решения [пока] не увидел.
Прошу сильно не шпынять, если такой (подобный) вопрос уже был.

ps: Free Pascal + Lazarus выбрал потому, что когда-то давно много пользовался Turbo Pascal'ем (вплоть до 7.01).
Последний раз редактировалось trengtor 03.05.2013 18:30:17, всего редактировалось 2 раз(а).
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

Re: Вопрос: как подключить чужую DLL?

Сообщение alexey38 » 03.05.2013 13:36:43

trengtor писал(а):Имеется DLL, содержащая API для управления некой железкой

А нет описания и интерфейсов (h-файлы) для C/C++?
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 13:42:01

Что есть – перечислено выше.

Вот из описания к врапперу:

Код: Выделить всё
C#
public static class SMC

Visual Basic
Public NotInheritable Class SMC

Visual C++
public ref class SMC abstract sealed


Как описаны методы:

Код: Выделить всё
C#
public static bool Connect(
   string port,
   int motors
)

Visual Basic
Public Shared Function Connect ( _
   port As String, _
   motors As Integer _
) As Boolean

Visual C++
public:
static bool Connect(
   String^ port,
   int motors
)
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

Re: Вопрос: как подключить чужую DLL?

Сообщение Vadim » 03.05.2013 14:35:28

trengtor
Можно скомбинировать оба источника информации - название функций брать из DependencyWalker (например SMCConnect) и искать соответствующее этой функции название в методах (например, bool Connect(string port, int motors)). Таким образом в Pascal у нас будет:
Код: Выделить всё
Function SMCConnect(port: string; motors: integer): boolean;  cdecl; external 'Название_DLL-ки';

;)
Vadim
долгожитель
 
Сообщения: 2617
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вопрос: как подключить чужую DLL?

Сообщение SSerge » 03.05.2013 15:15:37

Vadim писал(а):Таким образом в Pascal у нас будет:

Не будет. Класс String из .net framework во freePascal эквивалента не имеет.
Более того, это DLL управляемой среды исполнения, по этому поводу необходимо читать в MSDN, как вызывать управляемый код из нативного, и можно ли вообще.
Самое рациональное - воспользоваться той языковой средой, для которой .DLL написана.
SSerge
энтузиаст
 
Сообщения: 811
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 15:43:37

Vadim, большое спасибо за пример синтаксиса.

SSerge, я предполагаю, что сам по себе API DLL не является ни объектным, ни дотнетовским (демонстрационная программа использует только API DLL и является слишком маленьким портабельным приложением-экзешником, чтобы быть дотнетовским приложением, imho). Соответственно, объекты на API натянуты с помощью Wrapper DLL. Поэтому мне видится тот же самый способ использования API DLL, что предлагает Vadim: имя вызова (функции) брать из описания DependencyWalker, а параметры и возвращаемые значения вызова – из описания к врапперу.

На днях получу в руки эту железку – попробую через консольное приложение пощупать, получается ли получать доступ к вызовам API DLL предложенным способом.

ps: Ну очень не хочется мне влезать ради всего этого в Си Шарп или Вижуал Васик...
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

Re: Вопрос: как подключить чужую DLL?

Сообщение alexey38 » 03.05.2013 16:45:31

trengtor писал(а):Visual C++

Из приведенного текста видно, что есть возможность использования С++. Значит либо есть текст класса на С++ с h-файлом, либо есть lib и h-файл. Копать намного проще через Сишный текст.
Последний раз редактировалось alexey38 03.05.2013 17:32:25, всего редактировалось 1 раз.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 16:53:09

alexey38, все, что имеется в наличии (доступно) – перечислено выше.
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

Re: Вопрос: как подключить чужую DLL?

Сообщение alexey38 » 03.05.2013 17:21:39

trengtor писал(а):alexey38, все, что имеется в наличии (доступно) – перечислено выше.

Да Вы вообще ничего не перечислили. Вы привели цитаты непонятно откуда взятые. Вам нужно перечислить перечень файлов, которые Вам достались. Враппер - это же не кусок текста из 3-х строк. Не хотите помощи и советов - Ваше право, разбирайтесь сами. Только для чего тогда спрашиваете?
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Вопрос: как подключить чужую DLL?

Сообщение SSerge » 03.05.2013 17:31:27

Обращения к .net-овским .DLL есть не самое удобное дело.
Вот, например, как из Visual C++ таким кодом общаются: http://trtrmitya.wordpress.com/2007/12/ ... %BD%D0%BE/
(нашел довольно случайно, работоспособность не применялась).
SSerge
энтузиаст
 
Сообщения: 811
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 17:46:21

SSerge, если бы меня в данный момент интересовала реализация приложения на C/С++/С#/VB, то я, вероятно, не пришел бы с этим вопросом на форум программистов, использующих Pascal. Обломаюсь с Pascal'ем – вот тогда и буду думать про дотнетовскую реализацию.

ps: Я там поправил немного первое сообщение – видимо, я сперва не совсем внятно указал в (3), что эта информация бралась не из дотнетовского враппера, а из самой APIшной DLLки.
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

Re: Вопрос: как подключить чужую DLL?

Сообщение SSerge » 03.05.2013 17:58:54

Я вам просто пример привел, что вам придется реализовать, чтобы вызвать функцию из враппера для .NET
во всяком случае порядок действия придется повторить, C++ это или freepascal.

Если считаете, что .dll нативная, что ж, успехов.
В конце концов можно дизассемблировать враппер ildasm'ом или чем то еще и вычислить типы параметров из обращений к функциям.
Но, довольно странно, что кроме .net интерфейса в случае нативной .dll у вас ничего нет.
Подобные API обычно как минимум снабжаются примерами на Си и соответствующими интерфейсными библиотеками
SSerge
энтузиаст
 
Сообщения: 811
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 18:27:35

Это проприетарное изделие. Что вендор (Velleman) положил в комплект и на сайт – то и есть. Увы.
Мысли про дизассемблинг оригинальной DLL (не враппера) были.
Дизассемблинг враппера, видимо, тоже может помочь.

Добавлено спустя 11 минут 6 секунд:
С помощью PEiD пощупал имеющийся APIшный DLL (не дотнетовский враппер).
Вот что оно мне выдало: Borland Delphi 5.0 KOL/MCK, не упакованный.
Как я понимаю, это многое упрощает, поскольку вызовы, скорее всего, полностью совместимы.
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

Re: Вопрос: как подключить чужую DLL?

Сообщение alexey38 » 03.05.2013 20:14:11

trengtor писал(а):ps: Я там поправил немного первое сообщение – видимо, я сперва не совсем внятно указал в (3), что эта информация бралась не из дотнетовского враппера, а из самой APIшной DLLки.

Эта информация (п.3) не имеет особой ценности, она бесполезна. При желании ее можно получить просто открыв в HexView саму исходную DLL.

Вы можете угадывать какие параметры используются в перечисленных в п.3. функциях, но угадывать Вы будете 100 лет, это хуже, чем подбор пароля. Вы можете дезассемблировать эту DLL, хотя вряд ли чего-то поймете, т.к. нужно еще и смысл понимать. Идя этим путем я думаю, что Вы потратите несколько месяцев (может быть полгода или год) и без гарантии в результате.

Единственный разумный путь, это изучить Ваш враппер, но о самом враппере Вы очень мало сказали. Вы сказали, что есть DLL, и есть описание, но само описание кроме малой цитаты Вы не показали. Хотите помощи, выкладывайте реальные файлы описания враппера для С++ (это .cpp, .h, .hpp), т.к. DLL без интерфейса к ней никто не делает. Не хотите - думайте сами.

В любом случае, если названия функций враппера совпадают с названиями функций API DLL, то вот Вам и первое приближение в части передаваемых функций. Но дальше придется угадывать, возможно, что вместо String будет PChar, но нужно угадать какой тип параметров использовался stdcalc, cdecl или др. Если железка адекватная то методом проб и ошибок Вы рано или поздно подберете параметры функций. Если железка сложная и с ней просто так не поиграешь, то будете копаться долго.

В зависимости от того, что Вы хотите сделать с железкой, то возможно будет проще все же взять и написать код на C#, который не так далек от паскаля (смесь С++ и паскаля). Изучить шапр можно за неделю, а подбирать параметры и тестить железку можно год.

P.S. Я бы не давал Вам советы, если бы сам некоторое время не занимался такими же задачами.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Вопрос: как подключить чужую DLL?

Сообщение trengtor » 03.05.2013 20:28:09

Ну вот, нашлось-таки и для борланд-паскаля (понятно, что речь идет об именах вызовов и о типах). Всем спасибо :)
Последний раз редактировалось trengtor 05.05.2013 16:22:49, всего редактировалось 1 раз.
Аватара пользователя
trengtor
новенький
 
Сообщения: 71
Зарегистрирован: 03.05.2013 08:57:43
Откуда: Москва

След.

Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru