Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331

Подгрузка библиотеки, основные ошибки и их решения

17.11.2013, 21:54. Показов 2865. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа, в которую необходимо подгрузить библиотеку inpout32.dll, загружаю так:
C++
1
2
3
4
5
6
hLib=LoadLibrary ("inpout32.dll");  // Загружаем DLL в проект
if(hLib==NULL){
                  ShowMessage(AnsiString("Error Load inpout32.dll"));
             }
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
out32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
в принципе все работает, но не во всех случаях, вот и складывается вопрос как ее объявить, так чтобы она была видна всему проекту, в проекте используются потоки Thread Object, в потоках к ее функциям обратиться нельзя (не видны). И в каком месте в потоке надо объявлять библиотеку с ее функциями?!

Добавлено через 52 минуты
вот сам поток:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <h.h>
#include <stdio.h>
#include "thr.h"
#pragma hdrstop
 
#include "Unit3.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall sp::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
__fastcall sp::sp(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
 
 
void SendByte(unsigned int dta)
{
//ShowMessage(dta);
//Form1->ListBox1->Items->Add((AnsiString)dta);
//cout<<"-- Sending byte "<<(int)dta<<endl<<endl;
 
//???? ?????????? ?????? ?????
for (int i=0;i<8;i++){
 
//????????? ????????
//Delay(1);
 
//????????? ???? SPI_DI ? ???????????? ? ???????????? ?????
port=(((1<<(7-i))&dta)>0)?SPI_DI:0x00;
UpdatePort();
 
//????????? ????????
//Delay(1);
//?????????????? ???? SPI_SCLK (???????????? ??????)
port^=SPI_SCLK;
UpdatePort();
 
//cout<<"."<<endl;
}
//????????? ????????
//Delay(1);
}
 
 
void __fastcall sp::Execute()
{
HMODULE hDLL=LoadLibrary ("inpout32.dll");  // Çàãðóæàåì DLL â ïðîåêò
if(hDLL==NULL){
                  ShowMessage(AnsiString("Error Load inpout32.dll ?? ???????? "));
             }
inp32 = (inpfuncPtr) GetProcAddress(hDLL, "Inp32");
out32 = (oupfuncPtr) GetProcAddress(hDLL, "Out32");
 
SendByte(0x01);
}
На выполнении команды SendByte(0x01);, возникает ошибка Project sp.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue

Хотя в другом потоке отрабатывает нормально без ошибки. что не так?

Добавлено через 13 минут
Забыл еще процедуру UpdatePort
C++
1
2
3
4
void UpdatePort()
{
out32(lpt_data,(short)port);
}
Почему-то если вызывать в потоке UpdatePort(); - возникает ошибка, если использовать команду напрямую которую она выполнят out32(lpt_data,(short)port);, ошибки не возникает - ничего не понимаю, в параллельном потоке то все работает!(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2013, 21:54
Ответы с готовыми решениями:

Основные библиотеки-конкуренты jQuery
Какие из существующих библиотек смогли бы заменить jQuery?

Основные ошибки веб-мастеров
Основные ошибки веб-мастеров переработано в свободный стиль. 1. Семантика. 1.1. при составление семантического ядра, для сайта, 80%...

Реализовать статическое и динамическое решение, оформив основные этапы решения задачи в виде функций.
Помогите плиииииииз(( Реализовать статическое и динамическое решение, оформив основные этапы решения задачи в виде...

14
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.11.2013, 23:33
C++
1
HMODULE hDLL=LoadLibrary ("inpout32.dll");  // Загружаем DLL в проект
А выгрузить ?

Добавлено через 1 минуту
C++
1
2
inp32 = (inpfuncPtr) GetProcAddress(hDLL, "Inp32");
out32 = (oupfuncPtr) GetProcAddress(hDLL, "Out32");
А проверить нашло ли оно эти ф-ции ?

Добавлено через 55 секунд
inp32,out32 где вообще объявлены ?

Добавлено через 1 минуту
C++
1
ShowMessage(AnsiString("Error Load inpout32.dll ?? ???????? "));
А это чЁ за нафиГ в потоке ?
1
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 02:12  [ТС]
По порядку, объявлено в заголовочном файле, то что рабочая библиотека и заголовочный файл не сомневаюсь - так как есть программа писанная мною без потоков - 100% рабочая. FreeLibrary просто здесь не указал - а так все выгружаю.

сам заголовочный

C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdlib.h"
 
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);
 
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
inpfuncPtr inp32;
oupfuncPtr out32;
 
HANDLE hLib;
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2013, 02:16
Проверки ?
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 09:16  [ТС]
Поясните, что Вы этим хотели сказать "проверки"?!
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2013, 15:04
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall sp::Execute()
{
 
std::ofstream log("log.txt");
 
HMODULE hDLL=LoadLibrary ("inpout32.dll");  // Загружаем DLL в проект
if(!hDLL)
  log<<"Не удалось загрузить библиотеку inpout32.dll"<<std::endl;                
    
inp32 = (inpfuncPtr) GetProcAddress(hDLL, "Inp32");
out32 = (oupfuncPtr) GetProcAddress(hDLL, "Out32");
 
if(!inp32)
  log<<"Не удалось найти функцию Inp32()"<<std::endl;
 
if(!out32)
  log<<"Не удалось найти функцию Out32()"<<std::endl;
 
log.close();
//...
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 19:05  [ТС]
Avazart, Вы меня видимо не поняли, все отрабатывает без ошибок, но если в двух разных потоках функции одинаковых имен - то выскакивает такая ошибка, выше описана, а если имеют разные имена - то ошибки нет!

То есть если в двух потоках sp и sp1 имеется функция
C++
1
2
3
void UpdatePort(){
out32(lpt_data,(short)port);
}
возникает ошибка! А вот если будут void UpdatePort() и void UpdatePort2() - то все работает - что можно сказать о всех других дублируемых функциях между потоками!
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2013, 19:17
Выложите весь проект, если не можете нормально объяснить.
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 19:48  [ТС]
Вот сам проект!
Вложения
Тип файла: rar sp.rar (472.9 Кб, 45 просмотров)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2013, 20:21
Хз, никаких ошибок не заметил при запуске

Добавлено через 3 минуты
И вообще я не понимаю нафига грузить DLL прям в каждом потоке.
А ошибки могут быть из-за самой DLL ведь неизвестно что там и не нарушает ли он многопочность.
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 20:32  [ТС]
Объясните, как тогда правильно грузить библиотеку, чтобы работала с проектом. При запуске нет, а вот если выполнять(запустить каждый поток) потоки (заведомо расскомментировать в потоке sp1, а другую ниже закомментировать, то и будет ошибка. Помогите - тогда лучше какую библиотеку для доступа к LPT на низком уровне в Windows Vista / 7
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2013, 20:52
Цитата Сообщение от GaFBich Посмотреть сообщение
(запустить каждый поток)
Раскоментировал, запускал ....
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 21:33  [ТС]
Хм, ничего не пойму(, если я правильно понял, в каждом потоке использовалась процедура UpdatePort() и при этом нажимаю каждую кнопку, ошибки не возникало?
0
18.11.2013, 21:38

Не по теме:

Это я не пойму ваш чудо-код и чудо-идею ...

0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
18.11.2013, 21:53  [ТС]
Вы меня извините, но я вроде не критики в стилистике просил, а дельных советов, то что вы не знаете идеи это Вам не мешает анализировать данную проблему. Я даже подумал установить Builder C++ 6.0 на другой машине в надежде в том что проблемы в самом билдере. Ну если задумка интересна, то это программатор SPI микросхем под определенное железо, все работает как часы если не использую потоки, а потоки решил использовать - меня несколько напрягает то что в процессе чтения или записи микросхемы программа заморожена, так как там все практически в циклах!

Добавлено через 7 минут
Поставил на другой машине, и все работает - короче видимо что-то когда то на ней напортачил)

Добавлено через 1 минуту
а как можно узнать какие функции имеются в динамической библиотеке, я имею в виду при помощи WINAPI того же?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2013, 21:53
Помогаю со студенческими работами здесь

Готовые библиотеки для решения систем уравнений
Методом Гаусса. Приведением к диагональному виду. Разрядность 32 бита, при обращении элементов главной диагонали в ноль возвращается FALSE.

Библиотеки для решения (недоопределённых) систем линейных уравнений
Знает кто-нибудь сабж?. Если система недоопределена, то нужно в некотором формате отдавать её общее решение, ну или ФСР. Слышал про...

Библиотеки и ошибки
Вот такой код спокойно компилируется, но запускаться упорно не хочет. Ссылается на отсутствие Opengl.dll. При добавлении этой библиотеки...

Есть ли специальные библиотеки для решения задач высшей математики
подскажите пожалуйста есть ли для c# специальные библиотеки для решения задач высшей математики типо решения уравнений решения...

Класс "Длинных чисел", основные арифметические операции (найти причины и способы устранения ошибки)
Всем привет:) помогите пожалуйста решить проблему: делаю класс длинных чисел, обязательно нужно использовать конструкторы(по умолчанию, с...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru