С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42

Неявная загрузка dll

25.12.2014, 19:19. Показов 3383. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте дорогие форумчане, вопрос такой, когда я делаю неявную загрузку dll, подключаю в свойствах проекта lib файл. Вот допустим прога работает, но когда я удаляю dll, то вылетает ошибка, как мне сделать так, чтобы при удалении dll не вылетала ошибка, а выводилось сообщение на экран, что нет dll?Знаю, что бред, но все же.Заранее Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2014, 19:19
Ответы с готовыми решениями:

Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
GetProcAddress не берет значение переменной из *.dll Не могу понять почему. Помогите. ------------------------- *********** ...

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

DLL и Динамическая загрузка DLL
Ребят, помогите, есть условие: Массив на 1000 элементов; Заполнение массива рандомно четырехзначными числами; После заполнение каждый...

14
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 19:27
А чем вывод вашего сообщения функционально будет отличаться от стандартного вывода ошибки отсутствия dll?
0
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42
25.12.2014, 19:28  [ТС]
Мой должен быть в консоли, просто вывод.Вопрос не зачем, а как?
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 19:36
Можно отложенную загрузку сделать и проверять наличие dll.

Добавлено через 6 минут
Или вместо проверки наличия файла dll можно перед первым вызовом функции из этой dll установить SetErrorMode в SEM_FAILCRITICALERRORS и проверять Last Error на ERROR_DLL_NOT_FOUND.
1
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42
25.12.2014, 19:38  [ТС]
Не могли бы вы по подробнее про второй способ,его куда нужно писать??Можно код увидеть,если Вам не сложно?
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 19:45
Алгоритм действий:

1. В параметрах компоновщика программы указываем /delayload:dllname - имя этой DLL. Таким образом DLL будет грузится при первом вызове функции из этой DLL. Подробнее - по ссылке.
2. Перед первым вызовом какой-то функции из этой DLL пишем:
C++
1
2
3
4
5
6
7
8
UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // так не будет показан стандартный MessageBox
SetLastError(NO_ERROR); // на всякий пожарный
SomeFuncFromYourDll(); // первый вызов какой-то функции
DWORD lastError = GetLastError();
if(lastError == ERROR_DLL_NOT_FOUND)
{
    // обработка ошибки
}
3. После всего лучше вернуть error mode обратно
C++
1
SetErrorMode(errorMode);
0
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42
25.12.2014, 19:50  [ТС]
Не работает, все равно вылетает ошибка
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 19:52
Пункт 1 точно выполнен?

Тут подробней, если надо.
0
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42
25.12.2014, 19:57  [ТС]
Да в компановщике прописал /DELAYLOAD:dll.dll
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 20:00
Если /DELAYLOAD правильно передан, то надо смотреть ДО первого вызова написан код, приведенный выше или нет. Наверное есть смысл выложить проект целиком.
0
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42
25.12.2014, 20:09  [ТС]
Вот часть кода
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
#include <Windows.h>
#include "stdafx.h"
double f_1 (double x) {
  return x*x;
}
double f_2 (double x) {
  return 1/sqrt(x);
}
double f_3 (double x) {
  return cos(x);
}
 
int main()
{
    UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
    SetLastError(NO_ERROR); 
    trap(3, 0, 0.01, f_1);//первый вызов функции
    DWORD lastError = GetLastError();
    if (lastError == ERROR_DLL_NOT_FOUND)
    {
        cout << "Нет dll";
        getch();
        return 0;
    }
    int k;
    double a,b,dx;
    setlocale(LC_ALL,"russian");
Добавлено через 6 минут
http://rghost.ru/59972660
вот архив с проектом
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 20:17
В настройках компоновщика надо dll.dll, а не /DELAYLOAD:dll.dll.
/DELAYLOAD:dll.dll надо писать не в настройках, а в параметрах командной строки.
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 20:20
Скрин.
Миниатюры
Неявная загрузка dll  
0
13 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 42
25.12.2014, 20:21  [ТС]
Сделал,вылетает ошибка в проекте: Необработанное исключение из-за вызова функции которой нет, попробуйте сами.
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2014, 21:03
Нашел только такой способ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
UINT errorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX);
SetLastError(NO_ERROR); 
DWORD lastError = NO_ERROR;
__try
{
    trap(3, 0, 0.01, f_1);//первый вызов функции
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    lastError = GetLastError();
    if (lastError == ERROR_MOD_NOT_FOUND)
    {
        cout << "Нет dll";
        getch();
        return 0;
    }
    else
    {
        FatalExit(lastError);
    }
}
Немного поправил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2014, 21:03
Помогаю со студенческими работами здесь

Загрузка dll
Я написал загрузчик exe. Но как загружать dll не знаю. Какой формат секции релокации? Добавлено через 3 часа 49 минут Я думаю что...

Загрузка Dll
Здравствуйте! Помогите решить проблему Есть dll инкапсулирующая в себе логику приема данных с порта и их десериализацию... причем идет...

загрузка dll
Доброго времени вам) делаю функцию для универсальной загрузки библиотек, тоесть, когда пользователь сам указывает имя длл, функцию в ней и...

Загрузка из DLL
Пытаюсь загрузить из dll картинку, код: procedure TForm1.FormCreate(Sender: TObject); var h: THandle; imageStream: TResourceStream;...

Загрузка DLL
Надо написать прогу, которая загружает указанную пользователем(!!!) библиотеку(DLL), выбрать из нее(библиотеки) функцию и т д. ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru