С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056

Подключение DLL, Access violation reading location

30.12.2012, 04:57. Показов 3540. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прив! Что я делаю не так?

Работаю в Visual Studio. Создаю Win32 project под именем MyDLL. В Application Type выбираю DLL.
В Additional Options ставлю checkboxы напротив export symbols и empty project. В проекте появляются три
папки: source files, header files, resource files. В папку header files добавляю файл MyDLL.h и пишу в его:

C++
1
extern "C++" __declspec (dllexport) int CALLBACK MyFunction(char *str);
В папку source files добавляю файл MyDLL.cpp и пишу в его:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "MyDLL.h"
#include "windows.h"
 
 int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) 
{
 return TRUE;
 }
 extern "C++" __declspec (dllexport) int CALLBACK MyFunction(char *str)
 {
 MessageBox(NULL,str,"Function from DLL",MB_OK);
 return 1;
 }
Далее сохраняю. А затем делаю built/built solution. В результате у меня на диске D:\MyDLL\Release появляются
файлы MyDLL.dll и MyDLL.lib и еще пару файлов. Закрываю проект.


Создаю проект Win32 proj для проверки под именем check. В Application Type ставлю Windows Application
а в Additional Options ставлю empty project. В D:\check копирую файл MyDLL.h из D:\MyDLL и MyDLL.lib с MyDLL.dll
из D:\MyDLL\Release. В самом проекте в source files добавляю check.cpp и в нем пишу:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 #include "windows.h"
 #include "MyDLL.h"
 
 typedef int (WINAPI *SumFunctionType)(char *);
 
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
 {
    HMODULE hLib=LoadLibrary(TEXT("MyDLL.dll"));
    SumFunctionType pfnMyFunction;
    pfnMyFunction=(SumFunctionType)GetProcAddress(hLib,"MyFunction");
    int iCode=(*pfnMyFunction)("Hello");
    FreeLibrary(hLib);
    return 0;
 }
Сохраняю. Далее Built/Built Solution. Все успешно завершается. Но только я пробую после этого запустить F5
как выскакивает Unhandled exception at 0x00000000 in check.exe: 0xC0000005: Access violation reading location 0x00000000. Что делать? Почему так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.12.2012, 04:57
Ответы с готовыми решениями:

Ошибка access violation executing location при динамическом подключении dll
Товарищи, помогите понять, что я упустил. Делаю все dроде как в статьях пишут, но возникает ошибка в процессе выполнения программы...

0xC0000005: Access violation writing location
Пытаюсь запустить стороннее приложение таким кодом: PROCESS_INFORMATION P_I; STARTUPINFO S_I; ZeroMemory(&S_I, sizeof(S_I));...

Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000
Есть задача Есть решение Основное приложение: #include "stdafx.h" #include <stdio.h> #include <conio.h> #include...

6
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
30.12.2012, 11:46
hLib && pfnMyFunction <> NULL?

Добавлено через 1 минуту
Не припомню таблицу, так что возможно так:
C++
1
GetProcAddress(hLib,"_MyFunction");
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
30.12.2012, 14:53  [ТС]
Поменял на GetProcAddress(hLib,"_MyFunction"). Ничего не изменилось.. Какую таблицу ты имеешь ввиду?

Добавлено через 14 минут
Почему то pfnMyFunction = NULL. Почему?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
30.12.2012, 18:29
Цитата Сообщение от proc3nt Посмотреть сообщение
Поменял на GetProcAddress(hLib,"_MyFunction"). Ничего не изменилось.. Какую таблицу ты имеешь ввиду?
Цитата Сообщение от rsdn
В таблице 1 приведены возможные варианты наименований для экспортируемой функции MyFunction, объявленной следующим образом:
C++
1
extern "C" void __declspec(dllexport) <calling convention> MyFunction(int Param);
В зависимости от соглашения о вызове (<calling convention>) и компилятора.
Соглашение о вызовеVC++C++ Builder
__stdcall_MyFunction@4MyFunction
__cdeclMyFunction_MyFunction
Создание в среде Borland C++ Builder dll, совместимой с Visual C++
Цитата Сообщение от proc3nt Посмотреть сообщение
Почему то pfnMyFunction = NULL. Почему?
Если DLL загружается - то невозможно найти метод.
Я не знаком, со всеми тонкостями VC++, но могу предположить, что необходимо прописать extern "C", а не "C++" для данного случая.
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
30.12.2012, 18:45  [ТС]
хм... создал в dll-ке .def файл. Теперь все работает без проблем. Даже если везде убрать declspec(dllexport).
Кто-нить может мн прокомментировать этот случай?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
30.12.2012, 19:20
Цитата Сообщение от proc3nt Посмотреть сообщение
Кто-нить может мн прокомментировать этот случай?
Цитата Сообщение от msdn
Файл определения модуля (DEF-файл) — это текстовый файл, содержащий один или несколько операторов модуля, описывающих различные атрибуты библиотеки DLL. Если для экспорта функций библиотеки DLL не используется ключевое слово __declspec(dllexport), то для библиотеки DLL потребуется DEF-файл.
Экспорт из библиотеки DLL с использованием DEF-файлов.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
31.12.2012, 01:23
Цитата Сообщение от proc3nt Посмотреть сообщение
Почему так?
потому что из за
Цитата Сообщение от proc3nt Посмотреть сообщение
extern "C++"
( я кстати не уверен что так можно писать)
нет такой функции MyFunction в DLLке есть MyFunction@(и здесь какие то символы)
все дело в том что в С
нельзя так написать
C++
1
2
3
void fnc(int m);
void fnc(double m);
void fnc(char m);
это будет одна и та же функция
А в плюсах можно это разные функции и чтобы линковщик не запутался компилятор добавляет служебные символы к имени функции и получаются три разных имени
для программы это незаметно, а для библиотеки уже заметно( имена выходят наружу и не совпадают с тем что ты написал)
поэтому для длл пишут
C++
1
extern "C"
чтобы не искажалось имя

Цитата Сообщение от proc3nt Посмотреть сообщение
C++
1
2
3
4
HMODULE hLib=LoadLibrary(TEXT("MyDLL.dll"));
   SumFunctionType pfnMyFunction;
    pfnMyFunction=(SumFunctionType)GetProcAddress(hLib,"MyFunction");
    int iCode=(*pfnMyFunction)("Hello");
не вижу ни одной проверки
библиотека может не открыться, функция не загрузится(что у тебя и произошло)....
посему код должен быть оформлен хотя бы так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HMODULE hLib=LoadLibrary(TEXT("MyDLL.dll"));
     if(hLib==NULL)
      {
       MessageBox(_T("Error load library"));
        return 0;
      } 
     SumFunctionType pfnMyFunction;
 if(!pfnMyFunction=(SumFunctionType)GetProcAddress(hLib,"MyFunction"))
      {
          MessageBox(_T("Error load func"));
        return 0;
      } 
 
     int iCode=(*pfnMyFunction)("Hello");
Добавлено через 2 минуты
Цитата Сообщение от proc3nt Посмотреть сообщение
создал в dll-ке .def файл. Теперь все работает без проблем. Даже если везде убрать declspec(dllexport).
Потому что это все есть в .def файле
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.12.2012, 01:23
Помогаю со студенческими работами здесь

Access violation reading location
добрый вечер , что может означать ошибка ? &quot;Exception thrown at 0x00B427CD in ConsoleApplication4.exe: 0xC0000005: Access violation reading...

Access violation reading location
Помогите пожалуйста! Создаю программу, которая ведет учет данных. В бинарный dat-файл записываются объекты класса (Account) -...

access violation reading location
access violation reading location такая проблема если вести информацию про двух и больше студентов помогите пожалуйста очень срочно надо ...

Access violation reading location
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На...

Access violation reading location
В функции выбрасывает исключение &quot;Access violation reading location&quot;, с чем может быть связано? void Cryptor::Encode(std::string* data) ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru