С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/28: Рейтинг темы: голосов - 28, средняя оценка - 4.89
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87

Подключение DLL

29.08.2011, 23:32. Показов 5543. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, помогите пожалуйста, уже третий день голову ломаю.
Подключаю к своей программке библиотеку швейцарских эфемерид swedll32.dll (функции написаны на чистом с), при вызове функции выскакивает Unhandled exception at 0x00000000 in ... Access violation.
Может линкер нужно настроить или я что-то неправильно делаю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef double( * swe_julday)(int god, int mes, int day, double hour, int gregflag);
//typedef int (*TSuperFunc2)();
//typedef void (*TSuperFunc3)();
//
HMODULE hMod;
swe_julday SuperFunc1;
 
double k;
//
hMod = LoadLibrary(L"swedll32.dll");
(FARPROC&) SuperFunc1 = GetProcAddress(hMod, "SuperFunc1");
 
 
 
k=SuperFunc1(2011,8,28,13.00,0);
 
 
FreeLibrary(hMod);
Спасибо.
С уважением, Сергей
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2011, 23:32
Ответы с готовыми решениями:

Подключение DLL
Не могу разобраться уже какой день, подключаю библиотеку, пишет что библиотека подключена а вот вункция не найдена... dll: #include...

Подключение DLL на Visual C++
У меня есть только файлы dll и lib, и то lib сгенерирован из dll с помощью программы Dll2Lib, h-файла нету. Хочу подключить библиотеку...

Подключение DLL к проекту
Привет всем. Как подключить DLL к проекту и как обращаться к этому DLL изнутри проекта? Допустим, есть DLL bin.dll и есть код который...

20
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
30.08.2011, 03:22
У тебя название ф-ции неправильное, _swe_julday@24 она. А вообще, какая-то загадочная эта dll.
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.08.2011, 07:03
Почему у тебя ссылка на указатель?
Пиши так
C++
1
SuperFunc1 = (swe_julday)GetProcAddress(hMod, "SuperFunc1");
Кроме того убедить, что конвенция вызова совпадает.
И самое главное, после получения адреса процедуры убедить, что он не равен 0. Тогда и ошибки этой не будет.

Добавлено через 1 минуту
Да и hMod на NULL тоже проверять надо.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
30.08.2011, 09:25
Цитата Сообщение от ksv_uk Посмотреть сообщение
Ребята, помогите пожалуйста, уже третий день голову ломаю.
Предлагаю 2 варианта
1-й

C++
1
2
3
4
#define IMPORT __declspec (dllimport)
#pragma comment(lib,"swedll32.lib") 
 
IMPORT double swe_julday(int god, int mes, int day, double hour, int gregflag);
2-й
Если swedll32.lib нет - можешь попробовать создать хедер и срр для подключения написав в проекте #import "swedll32.dll" - папке Debug создадуться два файлика tlh(аналог .h) и tli (аналог .срр)
1
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
30.08.2011, 19:48  [ТС]
Ребята, спасибо всем за помощь, но пока не удалось побороть мне проблему. Правда, статически еще не пробовал подключить. Не могу понять почему динамически не удается подключить. Уже спортивный интерес проснулся.
Переделал немного код
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
typedef double( * swe_julday)(int year, int month, int day, double hour, int gregflag);
 
HMODULE hMod;
swe_julday SuperFunc1;
 
double k;
//
hMod = LoadLibrary(L"swedll32.dll");
if (hMod){
 
    SuperFunc1 = (swe_julday)GetProcAddress(hMod, "SuperFunc1");
 
    if (SuperFunc1){
               AfxMessageBox(L"OK!!!");
               k=SuperFunc1(2011,8,28,11.00,0);
 
        }
        else
                 AfxMessageBox(L"FALSHE!!!");
 
}else
 
   AfxMessageBox(L"FALSHE!!!FALSE");
 
    FreeLibrary(hMod);
В результате получаем FALSE!!! Следовательно, какая-то проблема со взятием адреса.

Вот так описывается функция в документации к dll
C++
1
double swe_julday(int year, int month, int day, double hour, int gregflag);
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.08.2011, 20:08
Цитата Сообщение от ksv_uk Посмотреть сообщение
Вот так описывается функция в документации к dll
А почему им пишешь GetProcAddress(hMod, "SuperFunc1"); ?
Пиши GetProcAddress(hMod, swe_julday);
1
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
30.08.2011, 20:18  [ТС]
И так тоже не хочет
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
30.08.2011, 22:57
Цитата Сообщение от ksv_uk Посмотреть сообщение
Следовательно, какая-то проблема со взятием адреса
Я тебе уже написал, в чем проблема. Что за документация?
1
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
30.08.2011, 23:13  [ТС]
спасибо.
Я думаю, что действительно вижуал возвращает другое название. думаю, что с помощью этого можно что-то сделать "extern "C" __declspec(dllexport)", чтобы компилятор не декорировал имена. но пока еще не поборол. А документация, вот тут есть ftp://ftp.astro.com/pub/swisseph/doc/


С уважением. Сергей
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
30.08.2011, 23:17
проверить надо экспортируется функция или нет
кинь сюда эту длл-ку
1
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
30.08.2011, 23:23  [ТС]
вот она длл
Вложения
Тип файла: zip swedll32.zip (230.9 Кб, 106 просмотров)
0
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
30.08.2011, 23:35  [ТС]
Да, действительно экспортируемое имя другое
Сейчас попробую его использовать
Миниатюры
Подключение DLL  
0
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
31.08.2011, 00:23  [ТС]
Какое-то наваждение с этой длл
Вот так все работает, получаем адрес функции ->> выводит ОК!

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
typedef double( * swe_julday)(int year, int month, int day, double hour, int gregflag);
HMODULE hMod=NULL;
 
double k,p;
 
//
hMod = LoadLibrary(L"swedll32.dll");
 
if (hMod){
 
   
    swe_julday swejul = (swe_julday)GetProcAddress(hMod, "_swe_julday@24");
    if (swejul){
               AfxMessageBox(L"OK!!!");
               k=swejul(2011,8,28,11.00,0);
            p=k;
        }
        else
                 AfxMessageBox(L"FALSHE!!!");
 
}else 
    
 
   AfxMessageBox(L"FALSHE!!!FALSE");
 
  FreeLibrary(hMod);

А затем это.Что это может быть?

С уважением, Сергей
Миниатюры
Подключение DLL  
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
31.08.2011, 00:50
значится так это не
Цитата Сообщение от ksv_uk Посмотреть сообщение
написаны на чистом с)
а С++ искажение имен однако
грузить можно двумя способами
C++
1
2
3
4
5
6
7
8
9
10
11
12
HMODULE swedll32_dll;
 double( __cdecl* swe_julday)(int god, int mes, int day, double hour, int gregflag);
 
void InitLargeDLL()
{
swedll32_dll= LoadLibrary(_T("swedll32.dll"));// загружаем DLL
  if(swedll32_dll) //если загружена
  {
   (FARPROC &) swe_julday = GetProcAddress(swedll32_dll, "_swe_julday@24"); // грузим по имени
    (FARPROC &) swe_julday =GetProcAddress(swedll32_dll,MAKEINTRESOURCEA(73)); //грузим по Ord типа порядковый номер
   (FARPROC &) swe_julday = GetProcAddress(swedll32_dll, "_swe_julday"); // а вот эта не грузится
  }
Цитата Сообщение от ksv_uk Посмотреть сообщение
SuperFunc1 = (swe_julday)GetProcAddress(hMod, "SuperFunc1");
здесь ты должен писать имя функции библиотеки а не то что придумал

Добавлено через 16 минут
Цитата Сообщение от ksv_uk Посмотреть сообщение
А затем это.Что это может быть?
это значит ломается стек
прошел я сию функцию отладчиком это Паскаль-функция в конце
ret 18 а ты вызываешь ее как С функцию
после вызова функции
sub esp,18
вот стек и сорвало
доббавь ключевое слово PASCAL
вот так
C++
1
double(PASCAL* swe_julday)(int god, int mes, int day, double hour, int gregflag);
и будет тебе щастье

Добавлено через 7 минут
__stdcall современное
PASCAL устаревшее
можешь еще
C++
1
2
3
4
5
6
7
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall
2
7 / 7 / 1
Регистрация: 04.03.2011
Сообщений: 87
31.08.2011, 00:54  [ТС]
УРААААА! Работает!

ValeryS, огромное спасибо за помощь! Очень признателен Вам.

С уважением, Сергей!
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
31.08.2011, 00:55
ну и слава богу
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
31.08.2011, 01:27
Тю, а чего у меня не работает? Заменил на
C++
1
double(PASCAL* swe_julday)(int god, int mes, int day, double hour, int gregflag);
и все тот-же Run_Time.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
31.08.2011, 01:48
Цитата Сообщение от Digit@ll Посмотреть сообщение
Тю, а чего у меня не работает?
а кто его знает
вот рабочий кусок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HMODULE swedll32_dll;
 double( __stdcall* swe_julday)(int god, int mes, int day, double hour, int gregflag);
 
void InitLargeDLL()
{
swedll32_dll= LoadLibrary(_T("swedll32.dll"));
  if(swedll32_dll)
  {
   (FARPROC &) swe_julday = GetProcAddress(swedll32_dll, "_swe_julday@24");
  double k=swe_julday(2011,8,28,11.00,0);
                       
     (FARPROC &) swe_julday =GetProcAddress(swedll32_dll,MAKEINTRESOURCEA(73)); 
    k=swe_julday(2011,8,28,11.00,0);
             
  }
посмотри чему у тебя равен PASCAL
правой кнопкой мыши - перейти к определению
попробуй WINAPI
Я не зря ведь кусок WinDef.h запостил
может у тебя из-за настроек проекта не выполняется вот это условие
C
1
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
Добавлено через 4 минуты
ksv_uk,
Цитата Сообщение от ksv_uk Посмотреть сообщение
double swe_julday(int year, int month, int day, double hour, int gregflag);
это скорее всего описание из h файла который нужен при статической линковке

Добавлено через 3 минуты
Цитата Сообщение от Digit@ll Посмотреть сообщение
У тебя название ф-ции неправильное, _swe_julday@24 она
а как ты название функции узнал
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
31.08.2011, 02:49
Sorry за беспокойство, тупанул... И спасибо за PASCAL, работает с ним.
Цитата Сообщение от ValeryS Посмотреть сообщение
а как ты название функции узнал
Примерно так #12

Добавлено через 21 минуту
Да, и лучше вызывать по названию ф-ции, а не по её номеру. Будет меньше проблем с версиями.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
31.08.2011, 06:43
Цитата Сообщение от Digit@ll Посмотреть сообщение
Примерно так #12
не ну это то понятно
но ksv_uk, ее не присылал еще
вот я и подумал
как же ты её определил
неужели сам зашифровал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2011, 06:43
Помогаю со студенческими работами здесь

Подключение bass.dll
IDE - Visual C++ 2008. Только сегодня начал знакомство с этим компилятором И уже час пытаюсь подключить dll u lib. Есть bass.dll и...

dll динамическое подключение
что не правильно? #include<iostream> #include<Windows.h> #include<conio.h> typedef int(*dll_func)(); int...

Явное подключение dll библиотек
Привет всем. Недавно начал изучать c++ и столкнулся с проблемой подключения длл библиотек (динамически, статически всё получилось). ...

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual Studio 2013. При компиляции выдает ошибку...

Подключение DLL, Access violation reading location
Прив! Что я делаю не так? Работаю в Visual Studio. Создаю Win32 project под именем MyDLL. В Application Type выбираю DLL. В...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru