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

ввод/вывод - C++

Восстановить пароль Регистрация
 
 
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
15.09.2013, 06:22     ввод/вывод #1
Как определить откуда вызывают cout - из dll либо из исполняемого приложения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 08:05  [ТС]     ввод/вывод #2
может все таки есть мысли по этому поводу? хотя бы алгоритм какой нить.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.09.2013, 08:48     ввод/вывод #3
Цитата Сообщение от gomodril Посмотреть сообщение
может все таки есть мысли по этому поводу? хотя бы алгоритм какой нить.
мб просто подключить dll и попробовать вызвать cout, если не вызовется то значит не из dll, а если вызовется то значит из dll. Да хз как определить, и вообще какая разница откуда вызывать?
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 09:18  [ТС]     ввод/вывод #4
Разница есть, нужно в классе автоматически подключать метод создания консоли в случае если вызов идет из dll, если вызов идет из приложения, то создавать самому консоль не нужно т.к. она создается методом cout.
Нету имени
18.09.2013, 11:07
  #5

Не по теме:

cout - вы как пример взяли, так как
может фигню напишу, но мне так всегда казалось

Цитата Сообщение от gomodril Посмотреть сообщение
Как определить откуда вызывают cout
cout - не вызвают, она сама, в потоке, ставит вывод символов на печать
а сами символы печатаются другой, помоему из WinAPI функции

gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 11:54  [ТС]     ввод/вывод #6
Цитата Сообщение от Нету имени Посмотреть сообщение

Не по теме:

cout - вы как пример взяли, так как
может фигню напишу, но мне так всегда казалось


cout - не вызвают, она сама, в потоке, ставит вывод символов на печать
а сами символы печатаются другой, помоему из WinAPI функции

А разве я написал, что cout вызывают? Попробуйте в функции dll написать
C++
1
cout << "test";
И потом сделайте вызов этой функции, консольное окно не создастся. Для этого один из способов использовать AllocConsole(). А вот если в исполняемом приложении в функции написать
C++
1
cout << "test";
то консольное окно будет создано и в него пойдет вывод созданного потока методом cout.
Вот мне как раз и нужен алгоритм определения откуда происходит вызов.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 12:17     ввод/вывод #7
Цитата Сообщение от gomodril Посмотреть сообщение
то консольное окно будет создано и в него пойдет вывод созданного потока методом cout.
У меня почему-то так не происходит. (VS 2008). Если приложение консольное, то консоль создается операционной системой. Если нет - то попытка вывода на cout ни к чему не приводит. По крайней мере консольного окна я не вижу, а вижу обычное окно GUI-приложения.

Добавлено через 10 минут
Цитата Сообщение от gomodril Посмотреть сообщение
Вот мне как раз и нужен алгоритм определения откуда происходит вызов.
Непонятно, куда вы собираетесь вставлять код, реализующий этот алгоритм. Единственное логически приемлемое место это библиотечные программы вывода на cout. Но если так, то по вашим словам в этих программах уже существует такая проверка. Почему бы ею не воспользоваться?
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 12:30  [ТС]     ввод/вывод #8
Цитата Сообщение от palva Посмотреть сообщение
У меня почему-то так не происходит. (VS 2008). Если приложение консольное, то консоль создается операционной системой. Если нет - то попытка вывода на cout ни к чему не приводит. По крайней мере консольного окна я не вижу, а вижу обычное окно GUI-приложения.

Добавлено через 10 минут

Непонятно, куда вы собираетесь вставлять код, реализующий этот алгоритм. Единственное логически приемлемое место это библиотечные программы вывода на cout. Но если так, то по вашим словам в этих программах уже существует такая проверка. Почему бы ею не воспользоваться?
Вот и я про это говорю, что если создаете dll, то cout ни чего на консоль не выведет пока не создадите консоль сами, я создаю при вызове из dll консольное окно AllocConsole.
А в каких библиотеках есть подобная проверка? Мне например нужно контролировать определенные переменные создаваемые в стороннем приложении (не на С++), из него могу сделать вызов функции из dll, в dll соответственно пришлось написать код выводящий в консоль необходимую информацию по другому я эти переменные меняющиеся в реальном режиме времени увидеть не смогу. Еще можно сделать вывод через WindowsForm, но это для меня пока сложно. А через GUI это ведь MessageBox? Если так, то это неудобно, ведь на каждую итерацию вызова будет создаваться свой MessageBox.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 12:46     ввод/вывод #9
Вы не ответили на мои вопросы, а задали кучу новых, вызывающих такое же недоумение.
Цитата Сообщение от gomodril Посмотреть сообщение
если создаете dll, то cout ни чего на консоль не выведет пока не создадите консоль сами
Это не так. Выведет, если приложение консольное. Запросит консоль у приложения и выведет на нее.
Цитата Сообщение от gomodril Посмотреть сообщение
А в каких библиотеках есть подобная проверка?
Это у вас надо спросить. Вы только что утверждали, что такая проверка есть. То есть при попытке вывода на cout программа вывода проверяет, откуда произведен вывод и в зависимости от этого создает или не создает консоль. Или я вас не так понял?
Цитата Сообщение от gomodril Посмотреть сообщение
в dll соответственно пришлось написать код выводящий в консоль
Я в таких случаях выводил в файл и одновременно читал этот файл при помощи FAR. Никаких конфликтов не происходило. В крайнем случае можно прочитать этот файл после окончания работы программы блокнотом и проанализировать.

Добавлено через 4 минуты
Теперь я не понимаю, для чего вам эта проверка, если вам уже удалось вывести трассировку на консоль, созданную при помощи AllocConsole.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 13:06  [ТС]     ввод/вывод #10
Цитата Сообщение от palva Посмотреть сообщение
Вы не ответили на мои вопросы, а задали кучу новых, вызывающих такое же недоумение.

Это не так. Выведет, если приложение консольное. Запросит консоль у приложения и выведет на нее.
Это у вас надо спросить. Вы только что утверждали, что такая проверка есть. То есть при попытке вывода на cout программа вывода проверяет, откуда произведен вывод и в зависимости от этого создает или не создает консоль. Или я вас не так понял?

Я в таких случаях выводил в файл и одновременно читал этот файл при помощи FAR. Никаких конфликтов не происходило. В крайнем случае можно прочитать этот файл после окончания работы программы блокнотом и проанализировать.

Добавлено через 4 минуты
Теперь я не понимаю, для чего вам эта проверка, если вам уже удалось вывести трассировку на консоль, созданную при помощи AllocConsole.
Не путайте меня я не говорил, что у меня проверка такая есть, мне как раз она и нужно. И вообще я не знаю как можно создать консольную dll, если знаете, то поделитесь опытом...

Добавлено через 4 минуты
Для меня важен оперативный контроль переменных, консольное окно для этого подходит.
А насчет понимания тут все просто - есть класс вывода информации (не важно какой), этот класс подключается к проекту. Вот тут как раз и хотелось бы ввести универсальность класса дополнительным методом, который бы определял откуда будет вывод - из dll или из консольного или иного приложения.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 13:41     ввод/вывод #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <io.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
...
        AllocConsole();
        int  hCrt = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
        *stdin = *(::_fdopen(hCrt, "r"));
        ::setvbuf(stdin, NULL, _IONBF, 0);
        hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
        *stdout = *(::_fdopen(hCrt, "w"));
        ::setvbuf(stdout, NULL, _IONBF, 0);
        *stderr = *(::_fdopen(hCrt, "w"));
        ::setvbuf(stderr, NULL, _IONBF, 0);
 
        cout << "test";
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 13:59  [ТС]     ввод/вывод #12
Цитата Сообщение от palva Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <io.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
...
        AllocConsole();
        int  hCrt = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
        *stdin = *(::_fdopen(hCrt, "r"));
        ::setvbuf(stdin, NULL, _IONBF, 0);
        hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
        *stdout = *(::_fdopen(hCrt, "w"));
        ::setvbuf(stdout, NULL, _IONBF, 0);
        *stderr = *(::_fdopen(hCrt, "w"));
        ::setvbuf(stderr, NULL, _IONBF, 0);
 
        cout << "test";
У меня самого нечто подобное а где проверка? И кстати там не хватает еще после завершения всего цикла операций FreeConsole()

Добавлено через 6 минут
У меня все выглядит примерно так:
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
30
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
    {
    HANDLE hOut=0;
    if(hOut==0)
        {
        AllocConsole();
        FILE *hOut = _fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),2 /* _O_TEXT */),"w");
        *stdout = *stderr = *hOut;
        }
    if(hOut!=0)
        {
        FreeConsole();
        hOut = 0;
        }
    switch (ul_reason_for_call)
        {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
        }
    return TRUE;
    }
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 13:59     ввод/вывод #13
Я ответил на ваш вопрос, как вывести на консоль из приложения, которое не имеет консоли.
Про проверку я не понял самого вопроса. Я задал дополнительные вопросы, но вы мне ни на один вопрос не ответили.
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 14:10  [ТС]     ввод/вывод #14
Цитата Сообщение от palva Посмотреть сообщение
Я ответил на ваш вопрос, как вывести на консоль из приложения, которое не имеет консоли.
Про проверку я не понял самого вопроса. Я задал дополнительные вопросы, но вы мне ни на один вопрос не ответили.
несколько раз писал, что мне нужна проверка и писал какая именно
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 14:14     ввод/вывод #15
Цитата Сообщение от gomodril Посмотреть сообщение
несколько раз писал, что мне нужна проверка и писал какая именно
Может, кто-нибудь другой понимает, что вы хотите. Я без пояснений, уж извините, не понимаю. А пояснения вы давать отказываетесь.
Нету имени
177 / 22 / 2
Регистрация: 16.05.2013
Сообщений: 181
18.09.2013, 14:27     ввод/вывод #16
я так понял, в приложении А - есть переменные, которые нужно контролировать в реальном времени
эти переменные можно считать( по его словам ) из Dll,
а потом через cout вывести в консоль необходимую информацию

Не по теме:

я так понял

palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 14:30     ввод/вывод #17
Нету имени, Тогда у него нет проблем. Он создает консоль, как я написал, и выводит.
Ему нужна некая проверка, которую он хочет поместить непонятно куда.
Нету имени
177 / 22 / 2
Регистрация: 16.05.2013
Сообщений: 181
18.09.2013, 14:31     ввод/вывод #18
и ещё забыл добавить, что он хочет сделать метод, который бы определял, куда будет вывод этих данных ( по его словам ) в Dll, из консоли, или иного приложения
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
18.09.2013, 14:36     ввод/вывод #19
Цитата Сообщение от Нету имени Посмотреть сообщение
куда будет вывод этих данных ( по его словам ) в Dll, из консоли, или иного приложения
Вас я тоже не понимаю. Я дебил. Это точно. Ухожу за пивом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2013, 14:37     ввод/вывод
Еще ссылки по теме:

Ввод вывод C++
ввод вывод C++
C++ Поменять консольный ввод-вывод на файловый ввод-вывод

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

Или воспользуйтесь поиском по форуму:
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
18.09.2013, 14:37  [ТС]     ввод/вывод #20
Цитата Сообщение от Нету имени Посмотреть сообщение
я так понял, в приложении А - есть переменные, которые нужно контролировать в реальном времени
эти переменные можно считать( по его словам ) из Dll,
а потом через cout вывести в консоль необходимую информацию

Не по теме:

я так понял

Есть класс, который массивы автоматически определяет какой они размерности и выводит все через cout. Если класс использовать в консольном приложении, то консоль создается cout, если класс использовать в dll, то приходится руками писать дополнительный код. Этот код добавлен в класс дополнительными методами. Но хотелось бы, что бы класс сам определял, откуда происходит вызов - из консольного приложения или из dll, и при необходимости подключал метода по созданию консоли.
Yandex
Объявления
18.09.2013, 14:37     ввод/вывод
Ответ Создать тему
Опции темы

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