Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
09.09.2013, 18:42     Вывод в консоль из dll #1
Необходимо из 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 помещать ни чего нельзя из-за возможного вызова одновременно других процессов в ОС, якобы возникнут проблемы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2013, 18:42     Вывод в консоль из dll
Посмотрите здесь:

C++ Перестает работать вывод в консоль в Release версии dll
C++ Вывод в консоль\файл
C++ Вывод чисел на консоль
C++ Вывод данных на консоль
C++ Вывод массива на консоль
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
09.09.2013, 18:56     Вывод в консоль из dll #2
Цитата Сообщение от gomodril Посмотреть сообщение
из-за возможного вызова одновременно других процессов в ОС
возможно если еще кто то ее(dll-ку) приаттачит то тогда опять будет создаваться окно, почему бы для этого не сделать функцию? можно еще добавить мьютекс
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
10.09.2013, 09:02  [ТС]     Вывод в консоль из dll #3
Цитата Сообщение от Raali Посмотреть сообщение
возможно если еще кто то ее(dll-ку) приаттачит то тогда опять будет создаваться окно
А в целом я правильно делаю вызов или нет?

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

Мьютекс нужен для того, если все таки кто то(другой процесс) попытается второй раз запустить данное окно (и нам это не нужно), это как переменная, которая находится в межпроцессорном пространстве
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
11.09.2013, 11:50  [ТС]     Вывод в консоль из dll #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.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.09.2013, 12:30     Вывод в консоль из dll #6
Цитата Сообщение от gomodril Посмотреть сообщение
по причине hOut = 0
C++
1
 FILE *hOut = _fdopen
вы создаете новый hOut в пределах видимости if() { ...
а старый HANDLE hOut как был нулем так и остался
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
11.09.2013, 13:05  [ТС]     Вывод в консоль из dll #7
Цитата Сообщение от Raali Посмотреть сообщение
C++
1
 FILE *hOut = _fdopen
вы создаете новый hOut в пределах видимости if() { ...
а старый HANDLE hOut как был нулем так и остался
А что тогда уничтожает процесс AllocConsole ?
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.09.2013, 13:08     Вывод в консоль из dll #8
Цитата Сообщение от gomodril Посмотреть сообщение
А что тогда уничтожает процесс AllocConsole ?
А при каком условии она уничтожается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 14:10     Вывод в консоль из dll
Еще ссылки по теме:

C++ Консоль не запускается из-за отсутствия DLL
C++ Вывод псевдографики в консоль
Вывод escape в консоль C++

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

Или воспользуйтесь поиском по форуму:
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
11.09.2013, 14:10  [ТС]     Вывод в консоль из dll #9
Цитата Сообщение от Raali Посмотреть сообщение
А при каком условии она уничтожается?
Я наверное не корректно выражаюсь
Мне нужно в итоге получить следующее:
1. Приложение открывает dll где результаты работы функций выводятся в консольное окно
2. После остановки программы, консольное окно закрывается не программно (в ручную), при этом само приложение закрываться не должно

У меня во втором пункте при закрытии консольного окна в ручную, закрывается само приложение. Вот как отделить процесс консоли после остановки приложения, от самого приложения.
Yandex
Объявления
11.09.2013, 14:10     Вывод в консоль из dll
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru