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


CreateLInstance("e140")

Вы не вошли.

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

Андрей
30.10.2013 17:34:26
#1

Гость

CreateLInstance("e140")

Файл

#include <stdio.h>
#include "Lusbapi.h"
#include "LusbapiTypes.h"

#pragma comment (lib, "Lusbapi.lib")

#ifdef __cplusplus
extern "C" {
#endif

ILE140 *pModule;
MODULE_DESCRIPTION_E140 md;

void findADC()
  {
     pModule = static_cast<ILE140 *>(CreateLInstance("e140"));
     
     if(!pModule)
        {
           printf("ERROR");
           return;
        }
     if(!pModule->OpenLDevice(0))
        {
            printf("ERROR");
           return;
        }
     
  }         

#ifdef __cplusplus
}
#endif

не работает pModule = static_cast<ILE140 *>(CreateLInstance("e140"));

Что должно быть в папке с файлом?
Должен ли быть подключен к компьютеру прибор?
Где .lib файл хранить?
И e140.h??

Андрей
30.10.2013 18:12:40
#2

Гость

Re: CreateLInstance(&quot;e140&quot;)

не работает вот это

pModule = static_cast<ILE140 *>(CreateLInstance("e140"));

1. Библиотека 3.3 в проект включена. Компилирует все отлично.
2. Файл lusbapi.dll в system32 (не знаю только, нужен ли он там, если сделано 1)
3. Главный вопрос! НУЖНО ЛИ ПОДКЛЮЧИТЬ К КОМПЬЮТЕРУ прибор, чтоб это все работало?
(я не подключаю, пусть мне еррор выбивает!)

30.10.2013 18:22:00
#3

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

Re: CreateLInstance(&quot;e140&quot;)

1. Что конкретно означает "не работает вот это pModule = static_cast<..."?
2. Для нормальной отработки именно функции CreateLInstance() модуль E14-140 не обязан быть подключённым к компьютеру.

Андрей
30.10.2013 19:58:30
#4

Гость

Re: CreateLInstance(&quot;e140&quot;)

Я пишу программу на java.
Для доступа к АЦП (е14-140 в данном случае), используется С/С++ код. Java может вызывать код C/C++ (при помощи JNI).

строки:
/////////
...
pModule = static_cast<ILE140 *>(CreateLInstance("e140"));

if(!pModule)
{
printf("ERROR");
return;
}
...
/////////
находятся в методе, вызываемом с java. (этот код - для упрощения, вместо printf(..) другие функции для вывода в java программу).

при выполнении (java) выбивает ошибку:
Execution protection violation
A fatal error has been detected by the Java Runtime Environment:
The crash happened outside the Java Virtual Machine in native code.

То есть ошибка в native (c/c++) коде.
Если закоментировать эту "рModule = static_cast<..." строчку - все работает.

АЦП не подключен, то есть pModule == null, по-этому я ожидаю увидеть ошибку ("ERROR"), но ее нет(

Возможно ошибка в подключении библиотеки.
///////////

Скажите подробнее, что делать с Lusbapi.lib and Lusbapi.dll файлами?
А так же с Lusbapi.h?

31.10.2013 12:45:57
#5

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

Re: CreateLInstance(&quot;e140&quot;)

>При необходимости егоСкажите подробнее, что делать с Lusbapi.lib and Lusbapi.dll файлами? А также с Lusbapi.h?

.h включается в исходный текст через #include
.dll нужен не при компиляции, а при запуске программы (должен быть в каталоге, где .exe, либо в system32, либо в PATH)
.lib участвует в линковке (компоновке) программы, т.е. его надо включить в проект (или указать в командной строке линкера, если компилируете с командной строки)

Возможно, проблема в том, что lib файл не подходит к вашему компилятору. Чем собираете C++ проект?
В дистрибутиве lusbapi два варианта .lib - для Borland C++ Builder и для MSVC.

При необходимости можно пересоздать lib заново, например, как-то так (пример для MS):
http://www.asawicki.info/news_1420_gene … brary.html

Андрей
31.10.2013 13:40:41
#6

Гость

Re: CreateLInstance(&quot;e140&quot;)

ну я писал в программе Dev-Cpp..
скорее всего в это и проблема.

установлю Visual studio, попробую там скомпилировать.

31.10.2013 14:06:11
#7

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

Re: CreateLInstance(&quot;e140&quot;)

>ну я писал в программе Dev-Cpp..

Ага, так там же gcc. Для него можно сгенерить .lib

dlltool -l lusbapi.lib -d lusbapi.def -k

где lusbapi.def - текстовый файл следующего содержания:

LIBRARY lusbapi.dll
EXPORTS
CreateLInstance@4
GetDllVersion@0

Андрей
31.10.2013 14:17:29
#8

Гость

Re: CreateLInstance(&quot;e140&quot;)

Пробовал менять lib файлы, без ошибки компилируется только тот, что в папке MicroSoft.

dll файл находиться в системной папке (system32).

вот #includs

#include "jni.h"
#include <stdio.h>
#include "jni_md.h"
#include "JNItest1.h"
#include "Lusbapi.h"
#include "LusbapiTypes.h"


файлы проекта (я компилирую dll)

jni.h
jni_md.h
JNItest1.h
Lusbapi.h
LusbapiTypes.h
Lusbapi.lib
dllmain.cpp // код здесь

Lusbapi.lib я добавил в компоновщик...

Обьясните пожалуйста, как взаемодействуют h,lib,dll файлы?

Андрей
31.10.2013 15:33:40
#9

Гость

Re: CreateLInstance(&quot;e140&quot;)

Все работает, перекомпилировал в VisualStudio, выводит ошибку -> значит работает.

Спасибо за помощь!!!!

31.10.2013 18:53:50
#10

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

Re: CreateLInstance(&quot;e140&quot;)

Перегенерите файл dlltool/'ом, как написано в предыдущем сообщении. У меня gcc-mingw криво собирал с .lib для микрософта.

>Обьясните пожалуйста, как взаемодействуют h,lib,dll файлы?

Между собой никак smile

1) .h файл нужен, чтобы компилятор увидел идентификаторы типов, переменных и функций, иначе они будут не определены (undefined) и будет ошибка компиляции. (Кстати, в отношении функций здесь есть тонкость: компилятор может не выдать ошибку, если нет прототипа, но собрать неверный код - http://stackoverflow.com/questions/9182 … tions-in-c )

2) .lib файл - это объектный код, с которым линкер сопоставит вызовы этих функций. Можно сказать, что .lib - это коллекция из одного или более .obj

В нашем случае, с динамической библиотекой, .lib файл будет содержать не сам код, а некую затычку, которая говорит "поставь тут вызов функции из таблицы импорта, модуль такой-то.dll, экспортируемое имя такое-то".

.dll файл - это динамическая библиотека
http://en.wikipedia.org/wiki/Dynamic-link_library
По формату почти что переименованный .exe файл, у которого есть таблица экспортируемых функций (по именам или по номерам). Связывание с DLL выполняет не компилятор, а операционная система во время запуска программы.
Допустим, в импортах myprog.exe написано "из mylib.dll импортировать MyLibOpen, MyLibClose".
Тогда ОС должна найти mylib.dll (в каталоге, где exe файл, в system32, в PATH), загрузить его и подставить адреса функций в код вызывающей программы. Если dll не найдется - ОС выведет сообщение об ошибке.

Кстати, еще можно импортировать функции из DLL совсем динамически - во время выполнения программы. Для этого есть функции API LoadLibrary и GetProcAddress.

Андрей
31.10.2013 20:06:08
#11

Гость

Re: CreateLInstance(&quot;e140&quot;)

Спасибо большое за помощь! smile