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


E14-140 функция OpenLDevice

Вы не вошли.

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

МОТ
30.09.2011 15:04:42
#1

Гость

E14-140 функция OpenLDevice

ILE140 *pModule;
...

    // попытаемся получить указатель на интерфейс для модуля E14-140
    pModule = static_cast<ILE140*>(CreateLInstance("e140"));
    if (!pModule) {
        Application->MessageBox(L"Не могу получить интерфейс на модуль E14-140!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
        return;
    }

    hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    if (pModule == NULL);
    else {
        // попробуем обнаружить модуль E14-140 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
        for (i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++)
pModule->OpenLDevice(i)

выполняем такой код для инициализации прибора.
pModule->OpenLDevice(i) не находит ни одного прибора)Причем pModule он как-то определяет, а слот найти не может.

Что может влиять на OpenLDevice ?

есть другая программа . Там такой же код инициализации. Она нормально находит.
DLL менял. ПК перезагружал. Разве что с бубном не танцевал ещё
Ничего не понимаю  если учесть что это делается в самом начале любых программ для работы с АЦП)

30.09.2011 19:56:34
#2

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

Re: E14-140 функция OpenLDevice

1. Вы проверяете версию библиотеки?
2. Какую именно ошибку возвращает OpenLDevice()?

МОТ
02.10.2011 12:53:34
#3

Гость

Re: E14-140 функция OpenLDevice

OpenLDevice не выдает ошибки. Просто он ничего не находит!
Все проге закомментил и сделал кнопку тупо и написал

void __fastcall TMainForm::ToolButton9Click(TObject *Sender)
{
    ILE140* m;
   m=static_cast<ILE140*>(CreateLInstance("e140"));
   hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
   if(m == NULL);
   else{
      int i;
      for(i=0; i<127; i++) if(m->OpenLDevice(i)) break; // связываем первый попавшийся модуль Е140 с созданным интерфейсом
      if(i<127)
      {

    }
      }
}
===================

Дак вот i=127 всегда... понять не могу от чего так.

МОТ
02.10.2011 12:57:48
#4

Гость

Re: E14-140 функция OpenLDevice

причем сделал пустой проект и там он благополучно находит устройство. Я думал что возможно где-то в коде проги интерфейс устройста ацп как-то скрыто занимается и поэтому выходит такая ошибка, но потом я поверграф открыл после того как он ничего не нашел в 127 слотах и поверграф начал нормально рисовать.

Блин. че заново проект делать? Копипаст глобальный что ли?


Какие причины могут быть что OpenLDevice не находит ни одного устройства в слотах ????????

МОТ
02.10.2011 14:05:09
#5

Гость

Re: E14-140 функция OpenLDevice

ничего не понимаю. Вот

void __fastcall TMainForm::FormCreate(TObject *Sender) {
    createThread();
}


//------------------------------------------------------


void createThread(){
    if (thr) return;

    char ModuleName[7];
    WORD i;

    Application->ProcessMessages();

    // проверим версию используемой DLL библиотеки
    if (GetDllVersion() != CURRENT_VERSION_LUSBAPI) {
        AnsiString ErrorMessage ="Неправильная версия библиотеки Lusbapi.dll!//n";
        ErrorMessage += "Текущая: " + IntToStr((int)(GetDllVersion() >> 0x10))+ "." + IntToStr((int)(GetDllVersion() & 0xFFFF)) + "      ";
        ErrorMessage += "Требуется: " + IntToStr(CURRENT_VERSION_LUSBAPI >> 0x10) + "." + IntToStr(CURRENT_VERSION_LUSBAPI & 0xFFFF);
        Application->MessageBox((wchar_t*)ErrorMessage.c_str(), L"ОШИБКА!!!",MB_OK + MB_ICONINFORMATION);
        return;
    }

    // попытаемся получить указатель на интерфейс для модуля E14-140
    pModule = static_cast<ILE140*>(CreateLInstance("e140"));
   //    pModule->ReleaseLInstance();
    if (!pModule) {
        Application->MessageBox(L"Не могу получить интерфейс на модуль E14-140!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
        return;
    }

    hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    if (pModule == NULL);
    else {
        // попробуем обнаружить модуль E14-140 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
        for (i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++)
            if (pModule->OpenLDevice(i)){
                  SlotCount=IntToStr(i);
                break;
            }
        if (i == MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI) {
            Application->MessageBox(L"Не могу обнаружить модуль //'E14-140//' в первых 127 виртуальных слотах!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
            return;
        }
        // связываем первый попавшийся модуль Е140 с созданным интерфейсом
        if (i < 127) {
            // попробуем прочитать дескриптор устройства
            ModuleHandle = pModule->GetModuleHandle();
            if (ModuleHandle == INVALID_HANDLE_VALUE) {
                Application->MessageBox(L"Не могу получить дескриптор устройства!", L"ОШИБКА!!!",MB_OK + MB_ICONINFORMATION);
                pModule->ReleaseLInstance();
                CloseHandle(hStopEvent);
                return;
            }
...
...
...
//--------------------------------------------

что тут не так?


У меня  вылетает месага
Не могу обнаружить модуль //'E14-140//' в первых 127 виртуальных слотах!

МОТ
03.10.2011 08:29:28
#6

Гость

Re: E14-140 функция OpenLDevice

Вообщем решил проблему. Перекопировал проект из одной папки в другую и заработало.

Можете объяснить что происходит?)))) Я вот ничего не понял например. Может в либе лкарда там ограничения есть на названия папок?

03.10.2011 13:31:35
#7

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

Re: E14-140 функция OpenLDevice

Наверное, цеплялась другая lusbapi.dll

Версию DLL проверять НЕОБХОДИМО, причем до обращения к каким-либо функциям, кроме GetDllVersion. Возвращенное значение должно быть СТРОГО равно CURRENT_VERSION_LUSBAPI, в противном случае вызывать методы созданных через CreateLInstance объектов нельзя, это может привести к аварийному завершению программы или непредсказуемым результатам (вызов по неверному указателю на функцию!).

CreateLInstance только создает объект (выделяет динамическую память), он не обращается к устройству и поэтому pModule было не NULL.

А OpenLDevice при ошибке вернет FALSE, после чего можно сделать GetLastErrorInfo и посмотреть, что за сообщение.

МОТ
04.10.2011 11:15:27
#8

Гость

Re: E14-140 функция OpenLDevice

ну версию я проверил
if (GetDllVersion() != CURRENT_VERSION_LUSBAPI)
они равны друг другу. 196611

GetLastErrorInfo  - это что? ВинАПИ функция какая -то ?

http://www.piclist.com/techref/os/win/a … f33_15.htm

это?

04.10.2011 11:41:01
#9

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

Re: E14-140 функция OpenLDevice

> GetLastErrorInfo - это что? ВинАПИ функция какая -то ?
Вообще-то это метод класса (pModule->GetLastErrorInfo), см. lusbapi.h и документацию.

МОТ
04.10.2011 13:05:33
#10

Гость

Re: E14-140 функция OpenLDevice

ага. сделал.
        for (i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++){
           bool pr=pModule->OpenLDevice(i);
            if (pModule->GetLastErrorInfo(&leil)){
            unsigned char ErrorString[256]=leil.ErrorString;
            int ErrorNumber=(int)leil.ErrorNumber;
            int uy=0;
            }


короче в ErrorString=Ошибка TLusbbase::OpenLDeviceId(). Для работы устройства требуется Windows 98//me//xp

ErrorNumber=101

ErrorNumber

МОТ
04.10.2011 13:06:31
#11

Гость

Re: E14-140 функция OpenLDevice

На ПК стоит Xp SP3. )))
Как понять ошибку?

04.10.2011 13:33:31
#12

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

Re: E14-140 функция OpenLDevice

Во-первых, так lasterror будет соответствовать всегда слоту 127. Лучше уж тогда проверить только для слота 0 (если одно устройство) или вывести список из нескольких
for (i = 0; i < 10; i++)
{
if (pModule->OpenLDevice(i)) break;
<<здесь GetLastErrorInfo и вывод ошибки по слоту i>>
}

Про версию windows смешно smile Спросите
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
и напишите поля структуры osvi:
dwPlatformId
dwMajorVersion
dwMinorVersion

Но больше похоже, что все-таки в неудачном эксперименте была неверная версия DLL (отсутствовала в каталоге с exe файлом, подцепилась из %windir%//system32 ?) и еще не было проверки GetDllVersion. Тогда мог вызваться не тот метод вместо private TLUSBBASE::GetWindowsVersion и все пошло наперекосяк.

04.10.2011 14:12:47
#13

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

Re: E14-140 функция OpenLDevice

Первая фраза не актуальна - не разглядел скобки. Они у Вас непарные smile
Остальное в силе.

ьще
06.10.2011 17:53:40
#14

Гость

Re: E14-140 функция OpenLDevice

dll был и в папке винды и в директории с экзефаилом одинаковый.
GetDllVersion была.

Мне кажется что просто собирается в билдере проект не корректно. С путями что-то вытворяет просто. Не знаю. Может причина даже в билдере вообще. Ну смешно же, просто перекопировал проект в другую папку и он заработал.

06.10.2011 17:59:07
#15

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

Re: E14-140 функция OpenLDevice

Вообще с BCB могут быть такие приколы, что просто собирается неправильный код, не соответствующий исходному тексту. В таком случае должен помочь перезапуск среды и Rebuild проекта.

МОТ
07.10.2011 12:29:27
#16

Гость

Re: E14-140 функция OpenLDevice

Александр Е, это я делал все в первую очередь. Если разберусь с этим супер глюком отпишусь)))