Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Delphi и E14-140M

Вы не вошли.

 Поиск | Регистрация | Вход 

Василий
25.06.2014 21:54:23
#1

Гость

Delphi и E14-140M

Здравствуйте!
Пишу программу для обработки данных АЦП в delphi 7. Пишу оконное приложение, а не консольное как в примерах. В связи с этим возник вопрос как пользоваться функциями из dll. Мне удалось прочитать только номер версии dll, а воспользоваться другими функциями не получается.
Насколько я понял нужно воспользоваться функцией CreateLInstance, которая даст указатель на другие функции.
Пока для начала добавил два label на форму. В первом выводится версия dll, а во втором показывается получена ссылка на интерфейс или нет. Пока  ссылку на интерфейс получить не удается.Поэтому как я понимаю не получается воспользоваться другими функциями dll, которые доступны через этот интерфейс.
Прошу помочь  мне понять как в случае оконного приложения пользоваться функциями данного dll.

Привожу код, который написал:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
function GetDllVersion:DWORD; external 'Lusbapi.dll';
function CreateLInstance(DeviceName:PAnsiChar):Pointer; external 'Lusbapi.dll';
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
pModule:Pointer;
begin
lbl1.Caption:=IntToStr(GetDllVersion shr 16) +  '.' + IntToStr(GetDllVersion and $FFFF);
pModule := CreateLInstance(pCHAR('e140'));
  if pModule = nil then lbl2.Caption:='Не могу найти интерфейс модуля E14-140!'
    else lbl2.Caption:=' Module Interface --> OK';
end;

end.

26.06.2014 11:28:48
#2

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

Оконное или консольное приложение - совершенно не играет роли для обращения к DLL.
Если CreateLInstance возвращает nil, то не может ли быть так, что Дельфи представляет строковую константу в юникоде, и PAnsiChar('e140') оказывается строкой 'e'#0?
Тогда попробуйте PAnsiChar(AnsiString('e140'))

Василий
26.06.2014 18:13:36
#3

Гость

Re: Delphi и E14-140M

Изменил строчку на
pModule := CreateLInstance(PAnsiChar(AnsiString('e140')));
Не помогло.Возможно проблема кроется в том, что pModule типа Pointer, а нужно сделать другой тип. В программе для примера стоит  тип данных для pModule, которого нет в оригинальном delphi(тип ILE140 в программе DacSample)

26.06.2014 18:37:02
#4

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

Что возвращает CreateLInstance?

Василий
27.06.2014 10:33:39
#5

Гость

Re: Delphi и E14-140M

По документации она возращает тип LPVOID. Но насколько я понял это равносильно pointer.
А если имеется в виду про то, что в программе возращает, то как раньше , что интерфейс не найден.

27.06.2014 11:45:27
#6

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,522

Re: Delphi и E14-140M

1. Для Delphi 7 и выше следует использовать библиотеку Lusbapi 3.3 и выше.
2. Пример с GUI можно скачать с:
            ftp://ftp.lcard.ru/pub/users/e140/guitest_e140.zip

27.06.2014 12:08:25
#7

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

Василий пишет:

А если имеется в виду про то, что в программе возращает, то как раньше , что интерфейс не найден.

Имелось в виду значение. Я так понимаю, что nil.
Тогда стоит задаться вопросом, установлен ли драйвер.
LGraph2 видит прибор? Тестовые примеры (например, get_info.exe из e140-console-test.zip) видят прибор?

Василий
27.06.2014 14:38:01
#8

Гость

Re: Delphi и E14-140M

Ну да все видит.И лампочка эта красная не мигает, а нормально горит. Ну насколько я понимаю после изменения все равно выдает nil и из-за этого выводится данное сообщение.Если конечно я правильно все понимаю.

Василий
27.06.2014 14:44:36
#9

Гость

Re: Delphi и E14-140M

Версия библиотеки последняя 3.4 и dll лежит в директории с программой.Собственно иначе бы программа бы не работала.

27.06.2014 15:15:52
#10

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,522

Re: Delphi и E14-140M

Так пример из #6 сообщения работает или нет?
В архиве и исходники есть. Проект собран под Delphi 7.

Василий
27.06.2014 15:33:41
#11

Гость

Re: Delphi и E14-140M

Ну да пишет версия 3,4 и интерфейс ок!!!

Василий
27.06.2014 15:38:37
#12

Гость

Re: Delphi и E14-140M

Может быть вы попробуете этот код мой в delphi закинуть и посмотреть будет работать или нет. И тогда может быть поймете, что исправить. Там по сути форма и на ней два label и все это запускается при запуске формы(программы). Сделать это 5 минут от силы.

27.06.2014 16:49:23
#13

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

Василий пишет:

Может быть вы попробуете этот код мой в delphi закинуть и посмотреть будет работать или нет.

Пожалуйста, для начала пропишите ...stdcall; external 'Lusbapi.dll';
(А это ведь написано в lusbapi.pas)

Василий
27.06.2014 17:51:37
#14

Гость

Re: Delphi и E14-140M

Интерфейс он нашел действительно помогло.Спасибо!Но теперь не понятно как получить доступ до всех других функций которые есть в этой библиотеке.Например я захотел добавить то, чтобы моя программа искала устройство в первых 100 вируальных слотах. Для этого я добавил код в программу такого рода.Но почему то дельфи жалуется на строчку теперь
for i := 0 to (100-1) do if pModule.OpenLDevice(i) then break;
if i = 100 then Label3.Caption:= 'нет в первых 100 слотах' ;
Что нужно исправить?Или в данном случае можно получить доступ до этих функций так же непосредственно без pModule?И если так зачем он тогда нужен?

27.06.2014 18:18:32
#15

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

Василий, чтобы компилятор увидел описание класса, его надо бы включить в проект. Нужные для этого файлы идут с библиотекой lusbapi (каталог lib/delphi).
В вашем примере выше почему-то наличие этих файлов проигнорировано, а просто заимпортированы функции из DLL (причем с ошибкой, которую выше исправили). Этого недостаточно.

Стандартный подход - взять файлы lusbapi.pas, e140.pas и т.д., включить в свой проект и при необходимости подправить под свою версию Delphi (с этим бывают подводные камни, но если что - пишите, попробуем помочь).
Также в принципе можно аккуратно перетащить все описания из этих файлов в свою программу: константы, структуры, объекты с методами... но это засоряет исходный текст.

27.06.2014 18:24:36
#16

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

...то есть, короче говоря, uses Lusbapi;

Василий
27.06.2014 21:53:30
#17

Гость

Re: Delphi и E14-140M

Я скопировал эти файлы в директорию с программой.Сделал uses Lusbapi.Он стал видеть функции без непосредственного обращения к dll. Но он все так не видит функции все остальные через pModule.Наверное нужно что-то сделать еще с другими файлами из lib. Но я не очень понимаю что просто.

P.S. Извиняюсь за свою тупость.Просто наверное не достаточно знаком с delphi, но программа нужно обязательно на этом языке.

Василий
28.06.2014 20:40:13
#18

Гость

Re: Delphi и E14-140M

Не получится ответить то есть на мой вопрос?(Как нужно использовать оставшиеся файлы для программы из lib)

30.06.2014 11:52:38
#19

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Delphi и E14-140M

Василий пишет:

Не получится ответить то есть на мой вопрос?

На вопрос, заданный в пятницу в 22:53? До понедельника едва ли. Сегодня как раз он wink

Василий пишет:

Я скопировал эти файлы в директорию с программой.Сделал uses Lusbapi.Он стал видеть функции без непосредственного обращения к dll. Но он все так не видит функции все остальные через pModule.Наверное нужно что-то сделать еще с другими файлами из lib. Но я не очень понимаю что просто.

Если unit скомпилировался и виден, то должны быть видны определенные в нем типы (классы). pModule должен быть не нетипизированный Pointer (аналог void* в C), а указатель на экземпляр класса.
Вы скачали файл guitest_e140.zip, на который дал ссылку Сергей? Там все это есть же:
var pModule: ILE140;

Василий пишет:

наверное не достаточно знаком с delphi, но программа нужно обязательно на этом языке.

Ну на C++ было бы привычнее, но раз обязательно - значит обязательно.