Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
#1

Вывод в консоль из dll - C++

09.09.2013, 18:42. Просмотров 1695. Ответов 8
Метки нет (Все метки)

Необходимо из dll открыть консольное окно и вывести в него нужную информацию. Уже неоднократно поднималась тема, но я так и не понял одного - все таки корректно или нет делать вызов из Dllmain?

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
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
    {
    switch (ul_reason_for_call)
        {
    case DLL_PROCESS_ATTACH:
            {
            AllocConsole();
            FILE *hf = _fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),2 /* _O_TEXT */),"w");
            *stdout = *stderr = *hf;
            break;
            }
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
            {
            FreeConsole();
            break;
            }
        }
    return TRUE;
    }
Так все работает, но уже несколько раз видел статьи в Интернете, что в DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH помещать ни чего нельзя из-за возможного вызова одновременно других процессов в ОС, якобы возникнут проблемы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 18:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод в консоль из dll (C++):

Перестает работать вывод в консоль в Release версии dll - C++
компилю dll в Release версию и после того как отключаю длл от проги и снова подключаю перестает работать вывод в консоль, хотя все...

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод) - C++
Как сделать чтобы список студентов выводился на экран в конце? #include<iostream> #include<stdio.h> #include<stdlib.h> ...

Консоль не запускается из-за отсутствия DLL - C++
Вот что выдал мне компьютер после попытки запустить мою консоль. Как это исправить? Почему консоль не запускается? Может быть, дело в том,...

Из DLL запустить скрытую консоль - C++
Здравствуйте. Существует ли возможность запустить из DLL скрытую консколь, которая бы выполнила определенный код, напр. через system?

Вывод в консоль - C++
Код без ошибок (VS не ругается при компиляции)! Но консоль не хочет выводить сообщений.. В чем может быть проблема? В консоли виден...

Вывод в консоль\файл - C++
Есть такая схема работы программы(см. внизу). В файле SML находится код программы. Допустим, этот код выполняет действие ввести число и...

8
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
09.09.2013, 18:56 #2
Цитата Сообщение от gomodril Посмотреть сообщение
из-за возможного вызова одновременно других процессов в ОС
возможно если еще кто то ее(dll-ку) приаттачит то тогда опять будет создаваться окно, почему бы для этого не сделать функцию? можно еще добавить мьютекс
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
10.09.2013, 09:02  [ТС] #3
Цитата Сообщение от Raali Посмотреть сообщение
возможно если еще кто то ее(dll-ку) приаттачит то тогда опять будет создаваться окно
А в целом я правильно делаю вызов или нет?

Добавлено через 14 часов 3 минуты
Цитата Сообщение от Raali Посмотреть сообщение
возможно если еще кто то ее(dll-ку) приаттачит то тогда опять будет создаваться окно, почему бы для этого не сделать функцию? можно еще добавить мьютекс
Разъясни пожалуйста, а то я начинающий только и не все понимаю.
Функцию создать в каком месте, в отдельном файле как метод класса? Или в самой Dllmain?
А что такое мьютекс?
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
10.09.2013, 13:48 #4
Цитата Сообщение от gomodril Посмотреть сообщение
Функцию создать в каком месте, в отдельном файле как метод класса? Или в самой Dllmain?
А что такое мьютекс?
Предполагалось что функция вызова окна консоли будет вызываться из дллки приложением, не в тот момент когда дллка подключается, а в тот момент когда приложение захочет этого (вызовет функцию из длл).

Мьютекс нужен для того, если все таки кто то(другой процесс) попытается второй раз запустить данное окно (и нам это не нужно), это как переменная, которая находится в межпроцессорном пространстве
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
11.09.2013, 11:50  [ТС] #5
Цитата Сообщение от Raali Посмотреть сообщение
Предполагалось что функция вызова окна консоли будет вызываться из дллки приложением, не в тот момент когда дллка подключается, а в тот момент когда приложение захочет этого (вызовет функцию из длл).

Мьютекс нужен для того, если все таки кто то(другой процесс) попытается второй раз запустить данное окно (и нам это не нужно), это как переменная, которая находится в межпроцессорном пространстве
А у меня разве не приложением вызывается окно консоли из dll? Если нет, то можно какой ни будь пример посмотреть?
Про класс мьютекс уже начал читать, это я так понимаю можно и на исключениях создать, правильно?

Добавлено через 20 часов 19 минут
Вынес AllocConsole из DllMain. Получилось вот так:

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
MT4_EXPFUNC void __stdcall ProcessOneArray(double *arr,int row)
    {
    HANDLE hOut=0;
    if(hOut==0)
        {
        AllocConsole();
        FILE *hOut = _fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),2 /* _O_TEXT */),"w");
        *stdout = *stderr = *hOut;
        //cout << "hOut DO" << "\t" << hOut << endl;
        //_getch();
        }
 
    clrscr();                                   // Очищаем экран clrscr();
    cout << "row :" << row << endl;
    cout << endl << endl;                       //Перевод каретки ниже на две строки
 
    vector<double> am(arr,arr+row);
    int col2=am.size();
    cout << "size :" << col2 << endl;
    for(int i=0; i<row; i++) cout << fixed << setprecision(5) << am[i] << endl;
 
    if(hOut!=0)
        {
        cout << "hOut POSLE" << "\t" << hOut << endl;
        _getch();
        FreeConsole();
        hOut = 0;
        }
    }
Что самое интересное, FreeConsole ни разу не вызвалось по причине hOut = 0. Что сделано не правильно, ведь процесс как то уничтожается и без FreeConsole.
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
11.09.2013, 12:30 #6
Цитата Сообщение от gomodril Посмотреть сообщение
по причине hOut = 0
C++
1
 FILE *hOut = _fdopen
вы создаете новый hOut в пределах видимости if() { ...
а старый HANDLE hOut как был нулем так и остался
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
11.09.2013, 13:05  [ТС] #7
Цитата Сообщение от Raali Посмотреть сообщение
C++
1
 FILE *hOut = _fdopen
вы создаете новый hOut в пределах видимости if() { ...
а старый HANDLE hOut как был нулем так и остался
А что тогда уничтожает процесс AllocConsole ?
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
11.09.2013, 13:08 #8
Цитата Сообщение от gomodril Посмотреть сообщение
А что тогда уничтожает процесс AllocConsole ?
А при каком условии она уничтожается?
0
gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 132
11.09.2013, 14:10  [ТС] #9
Цитата Сообщение от Raali Посмотреть сообщение
А при каком условии она уничтожается?
Я наверное не корректно выражаюсь
Мне нужно в итоге получить следующее:
1. Приложение открывает dll где результаты работы функций выводятся в консольное окно
2. После остановки программы, консольное окно закрывается не программно (в ручную), при этом само приложение закрываться не должно

У меня во втором пункте при закрытии консольного окна в ручную, закрывается само приложение. Вот как отделить процесс консоли после остановки приложения, от самого приложения.
0
11.09.2013, 14:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 14:10
Привет! Вот еще темы с ответами:

Вывод текста на консоль в C++ - C++
парни, необходимо перевести строку printf (&quot;%5d&quot;, a); в с++. интересует как записать “%5d” в с++

Вывод строки в консоль - C++
И так, вот код: #include &lt;iostream&gt; using namespace std; int main() { cout «&quot;У каждой эпохи свой язык\ n&quot;; return 0; } Вот...

Вывод псевдографики в консоль - C++
Нужно вывести в консоль текст, состоящий из символов вроде @ # ; и т.д. Создано на этом сайте- http://picascii.com/ Как это сделать?

Неверный вывод в консоль - C++
Здравствуйте. Начал изучать switch. Задача: Есть оценки &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;F&quot;. Собственно, пользователь должен ввести произвольно...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru