С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 03.11.2009
Сообщений: 10

Не получается явная загрузка dll

14.05.2011, 21:41. Показов 1824. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается выполнить явную загрузку dll. Ошибка - память не может быть read. В чем дело?
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <windows.h>
int main()
{
   void (*ptrPrint)(LPTSTR);
   HINSTANCE hinstLib = LoadLibrary("mydll.dll");
   ptrPrint=(void (*) (LPTSTR)) GetProcAddress(hinstLib,"print");
   ptrPrint("Hello");
   FreeLibrary(hinstLib);
   return 0;
}
Исходники из которых получена dll:
C
1
2
3
4
5
6
7
//mydll.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT void print(LPCTSTR text);
C
1
2
3
4
5
6
7
//mydll.c
#include <windows.h>
#include "mydll.h"
EXPORT void print(LPCTSTR text)
{
MessageBox(NULL, text, "My dll", MB_OK);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2011, 21:41
Ответы с готовыми решениями:

явная загрузка dll
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;tchar.h&gt; HMODULE p_dll = LoadLibrary(L&quot;create_dll.dll&quot;); ...

Явная загрузка DLL
Господа начал изучать , первая программа и проблема , буду признателен за помощь . вот кот dll #include &quot;dll.h&quot; #include...

Явная загрузка DLL
Доброго дня всем! Мне надо сделать явную подгрузку dll в проекте и использовать с нее некую функцию (например FormMatrix() ). Эта...

9
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
18.05.2011, 21:10
Вообще-то вопрос явно не из области WinAPI, ну а по существу, так ошибка скорее всего в том, что не проверяете, что возвращают вызовы LoadLibrary и GetProcAddress. 99,99% WinAPI функций возвращают результат, и привыкайте всегда проверять его перед дальнейшим использованием.

Ваш первый файл должен выглядеть примерно как:
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
#include <tchar.h>
#include <windows.h>
 
int main()
{
  typedef void (*PRINT) (LPTSTR);
  DWORD ErrCode = 0;
  HINSTANCE hinstLib = LoadLibrary(_T("полный_путь_к_DLL")); // здесь, скорее всего, Ваша ошибка
  if ( hinstLib )
  {
    
    PRINT ptrPrint = (PRINT)GetProcAddress(hinstLib, "print"); 
    if ( ptrPrint )
      ptrPrint( _T("Hello") ); // ! используется LPCTSTR, тип которого зависит от макроса UNICODE
    else
      ErrCode = GetLastError();
    
    FreeLibrary(hinstLib);
  }
  else
    ErrCode = GetLastError();
        
  return ErrCode;
}
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
18.05.2011, 23:02
Цитата Сообщение от negation Посмотреть сообщение
GetProcAddress(hinstLib,"print");
Имя функции согласно конвенции вызова __cdecl будет не "print", а "_print"
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
18.05.2011, 23:40
Имя функции согласно конвенции вызова __cdecl будет не "print", а "_print"
Если не ошибаюсь, "extern C" запрещает mangling имен, тем паче, что print не перегружается, хотя в общем случае все в конце концов зависит от компилятора и его настроек.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
18.05.2011, 23:52
Цитата Сообщение от kukuruku310 Посмотреть сообщение
Если не ошибаюсь, "extern C" запрещает mangling имен, тем паче, что print не перегружается, хотя в общем случае все в конце концов зависит от компилятора и его настроек.
Соглашения о конвенции останутся.. С++ компилятор вставляет свои грабли.. Вот пример на ошибке линкера
C++
1
2
3
4
5
6
7
8
9
10
int __stdcall foo();
extern "C" int __stdcall foo1();
 
int  main( )
{
    foo();
    foo1();
 
    return 0;
}
Code
1
2
1>main.obj : error LNK2001: unresolved external symbol "int __stdcall foo(void)" (?foo@@YGHXZ)
1>main.obj : error LNK2001: unresolved external symbol _foo1@0
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
19.05.2011, 00:04
У Вас, наверное, BC?. В нем, насколько знаю, надо в опциях напрямую запрещать подчеркивание. В мелкософтовом все линкуется нормально. Вообще-то для С-кода (а не С++) по идее (по стандарту???) не должно быть никаких "переименований", хотя с чистым C я практически дела не имел, да и в CPP не так уж натаскан. Но в любом случае, ошибка автора в игнорировании проверок результатов вызовов API.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
19.05.2011, 00:14
Цитата Сообщение от kukuruku310 Посмотреть сообщение
У Вас, наверное, BC?
Нет. У меня MS Visual Studio..
Цитата Сообщение от kukuruku310 Посмотреть сообщение
Вообще-то для С-кода (а не С++) по идее (по стандарту???) не должно быть никаких "переименований"
Любая функция должна соответствовать какой то конкретной конвенции.. иначе как потом параметры в нее передавать? в регистрах или через стек или все вместе..
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
19.05.2011, 00:25
Цитата Сообщение от ISergey Посмотреть сообщение
Нет. У меня MS Visual Studio..
странно, тогда почему мой .NET 2003 выдает все верно??? загадка...

Цитата Сообщение от ISergey Посмотреть сообщение
Любая функция должна соответствовать какой то конкретной конвенции.. иначе как потом параметры в нее передавать? в регистрах или через стек или все вместе..
так ведь линкер и не берет информацию об этом из имени функции, иначе зачем были бы нужно описывать прототипы и иметь lib-ы?
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
19.05.2011, 01:00
так ведь линкер и не берет информацию об этом из имени функции
Это компилятору нужно.. в lib (для dll) только служебная информация для статического линкования...
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
19.05.2011, 19:18
Цитата Сообщение от ISergey Посмотреть сообщение
Это компилятору нужно..
Ну да, я это и имел... Но вот оППисался - на старости лет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.05.2011, 19:18
Помогаю со студенческими работами здесь

Явная загрузка dll
Подскажите пожалуйста, что у меня в коде не так. Учился вот здесь https://www.cyberforum.ru/cpp-builder/thread154847.html но что то не...

Явная загрузка .dll
Поблема: библиотеку подключил, но внутри никак не найду функцию HMODULE hLibrary = 0; hLibrary = LoadLibrary(&quot;MyDll.dll&quot;); ...

Явная загрузка DLL из ДРУГОЙ DLL
Помогите явно загрузить DLL из исходной DLL Исходная DLL Unit1.h HINSTANCE dllInstance2; typedef int(__import *FType(int)); ...

Явная загрузка .dll (Выподает "ShowMessage")
Добрый денб форум, я пытаюс загрузить .dll с явным загрузком, но когда компилирую проект то выподает ShowMessage(&quot;I can't load...

Явная загрузка разметки из xml для popup window
Возможно ли для popupwindow загружать разметку через xml, чтобы не мучатся и создавать разметку в коде? А также как на момент когда попап...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru