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

Перестает работать вывод в консоль в Release версии dll - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 07:15     Перестает работать вывод в консоль в Release версии dll #1
компилю dll в Release версию и после того как отключаю длл от проги и снова подключаю перестает работать вывод в консоль, хотя все остальное переменные запись в тхт файлы итд все работает
кроме вывода текста в консоль

вот код длл майн

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
 
    switch(ul_reason_for_call){
        case DLL_PROCESS_ATTACH:
            AllocConsole();;
            break; 
        case DLL_THREAD_ATTACH:
            break; 
        case DLL_THREAD_DETACH:
            break; 
        case DLL_PROCESS_DETACH:
            FreeConsole();PQfinish(p_pgconn_my_db);PQfinish(p_pgconn);
            break;
    }
 
    return TRUE;
 
}
когда компилю в дебаг версию таких проблем нет отключать и подключать длл можно сколько угодно вывод в консоль работает
в релиз версии все работает только при первом подключении длл к проге
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 09:33     Перестает работать вывод в консоль в Release версии dll #2
Зачем обрабатываешь ATTACH и DETACH всё равно ничего особо нужного ты в кэйзах не делаешь?Попробуй simple DLL
C++
1
2
3
4
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 10:22  [ТС]     Перестает работать вывод в консоль в Release версии dll #3
-=ЮрА=-,

при DETACH:
мне надо чтобы консольное окно закрывалось и там еще дисконект был БД

а без AllocConsole();;
консольного окна вообще не будет у меня же длл а не консольное приложение
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 10:36     Перестает работать вывод в консоль в Release версии dll #4
nill, посмотри сюда Помогите с подключением dll к проекту
А так лучше какую то часть кода выложи, искать баг не видя код сложно
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
19.08.2011, 10:37     Перестает работать вывод в консоль в Release версии dll #5
А если так:
C++
1
2
3
4
5
6
7
8
9
10
        switch(ul_reason_for_call){
                case DLL_PROCESS_ATTACH:
                case DLL_THREAD_ATTACH:
                        AllocConsole();;
                        break; 
                case DLL_THREAD_DETACH:
                case DLL_PROCESS_DETACH:
                        FreeConsole();PQfinish(p_pgconn_my_db);PQfinish(p_pgconn);
                        break;
        }
?
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 10:49  [ТС]     Перестает работать вывод в консоль в Release версии dll #6
-=ЮрА=-,
тему посмотрел но как то ничего не нашел, можешь сюда скопировать что мне в код вставить
А по своему коду я с радостью бы выложил но что конкретно нужно ?
у меня все работает кроме вот этого бага с выводом текста в консоль при повторном подключении длл когда она скомпилена в release версии
в тхт все пишеться как обычно все работает только в консоли ничего не появляться


Евгений М.,
При подключении длл консольное окно появяеться
А видимо когда начинается работа с ним оно резко пропадает и потом вообще вся прога зависает
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 11:00     Перестает работать вывод в консоль в Release версии dll #7
Цитата Сообщение от nill Посмотреть сообщение
у меня все работает кроме вот этого бага с выводом текста в консоль при повторном подключении длл когда она скомпилена в release версии
- напиши клиента для DLL, я никогда не встречал чтобы DLL ещё и консоь выкидывала, один раз пробовал ввести в DLL встроенній shlobj - диалог - и всё окнчилось крахом, думаю с консолью в релизе тоже, в дебаге отрабатывает потому что это тестовый режим и во многом там сама студия тебе помогает, в ОС всё сложней и никаких механизмов фильтрации ошибок нет вот и опрокидывается твоё приложение
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 11:18  [ТС]     Перестает работать вывод в консоль в Release версии dll #8
-=ЮрА=-,
код клиента это ты имешь ввиду то приложение к которому я подключаю свою длл ?
если да то оно не мое кода у меня нет, но врятли в нем проблема
все глюки всегда из за моей длл
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 11:27     Перестает работать вывод в консоль в Release версии dll #9
Код своей длл, упрости его и давай на рассмотрение, да я имел ввиду именно
Цитата Сообщение от nill Посмотреть сообщение
приложение к которому я подключаю свою длл
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 11:30  [ТС]     Перестает работать вывод в консоль в Release версии dll #10
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
WHUSER_API double process_message(const char* pmessage, const void* param){
 
    if(pmessage==NULL){
        return 0;
    }
    if(param==NULL){
        return 0;
    }
    if(strcmp(pmessage,"state")==0){
        return process_state( (state*)param );
    }
    
    if(strcmp(pmessage,"query")==0){ 
        return process_query((const char*)param);
    }
    if(strcmp(pmessage,"pfgws")==0){
        m_pget_symbol = (pfgws_t)param;
        return 0;
    }
 
    return 0;
 
}
///////////////////////////////// 
//DLLMAIN 
///////////////////////////////// 
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
 
    switch(ul_reason_for_call){
        case DLL_PROCESS_ATTACH:
            AllocConsole();;
            break; 
        case DLL_THREAD_ATTACH:
            break; 
        case DLL_THREAD_DETACH:
            break; 
        case DLL_PROCESS_DETACH:
            FreeConsole();PQfinish(p_pgconn_my_db);PQfinish(p_pgconn);
            break;
    }
 
    return TRUE;
 
}
 
 
double process_query(const char* pquery){
 
}//в этой функции весь основной код
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 11:43     Перестает работать вывод в консоль в Release версии dll #11
Цитата Сообщение от nill Посмотреть сообщение
p_pgconn_my_db
- это что?, потом ты вначале закрываешь консоль а после завершаешь конект к чему-то
C++
1
2
3
FreeConsole();
PQfinish(p_pgconn_my_db);
PQfinish(p_pgconn);
Поменяй порядок действий
C++
1
2
3
PQfinish(p_pgconn_my_db);
PQfinish(p_pgconn);
FreeConsole();
То что ты дал мало, укажи что экспортируешь, интуитивно думаю что double process_message?
Это я уже додумываю что под WHUSER_API скрывается
C++
1
#define WHUSER_API __declspec
(dllexport)

Добавлено через 1 минуту
Давай код с расчётом чтобы я прогнал действия твоей длл, я не кудесник думать что ты и как делаешь, у тебя вообще может быть подключение не правельно организовано быть, что то не инициализировано, компилятор пропустил, и теперь ломаешь голову где же баг...

Добавлено через 3 минуты
Цитата Сообщение от nill Посмотреть сообщение
process_state( (state*)param );
- этой функции вообще нет, не хочешь показывать функции не показывай, но хотя бы в их прототипах оставь часть кода чтобы посмотреть как ты внутри тела параметры юзаешь...
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 11:58  [ТС]     Перестает работать вывод в консоль в Release версии dll #12
-=ЮрА=-,
сложновато просто выдирать
для длл я взял готовый шаблон и просто начал забивать туда свои расчеты
как там и что сильно не разбирал

вверху тех трех функция что я скинул стоит
#define WHUSER_EXPORTS

в хедер файле который подключен ко всем файлам проекта есть это

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef WHUSER_EXPORTS
#define WHUSER_API __declspec(dllexport)
#else
#define WHUSER_API __declspec(dllimport)
#endif
double process_state(state *psatate);
 
typedef double (*process_message_t)(const char* message, const void* param );
WHUSER_API double process_message( const char* message, const void* param );
typedef double (*pfgws_t)( int c, const char* psym, bool& iserr );
 
 
#endif

вот функция process_state

C++
1
2
3
4
5
6
7
8
double process_state(state* pstate){
 
    if(pstate!=NULL)
        m_state[ (++m_ndx)&0xff ] = *pstate;
 
    return 0;
 
}
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 12:20     Перестает работать вывод в консоль в Release версии dll #13
Цитата Сообщение от nill Посмотреть сообщение
++m_ndx
- а переменные какие ещё в проекте, хотябы типы приведи, к примеру напишу

C++
1
c = a + b;//это и дабл и инт и чар можно трактовать и вообще перегрузить оператор +, а и b будут матрицами
Не мучай меня, дай код со всеми переменными и функциями или я в ауте по этому заданию...
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 12:44  [ТС]     Перестает работать вывод в консоль в Release версии dll #14
-=ЮрА=-,
переменных куча есть все и инт и дабл и чар и стринг
и масивы эти типов есть

могу дать чистый проект куда я забивал данные

Добавлено через 5 минут
-=ЮрА=-,
скинул в личку
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 15:08     Перестает работать вывод в консоль в Release версии dll #15
Вот проет по созданию и использованию твоей DLL в папках Release специально оставил откомпилированные и рабочие либы и exe
[Результат работы UseDLL.exe]

process_message(testMSG,testParam) : 0.000000
Press any key to continue
Вложения
Тип файла: rar DLL.rar (27.1 Кб, 11 просмотров)
Тип файла: rar UseDLL.rar (37.0 Кб, 10 просмотров)
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
19.08.2011, 22:39  [ТС]     Перестает работать вывод в консоль в Release версии dll #16
-=ЮрА=-,

в проекте DLL.rar консоль вроде работает как надо но process_query(
можно печать только используя _cprintf(); простой cout << не работает но это мелочи

Объясни плз какую строчку кода мне надо поменять чтобы все заработало пока нашел только

DLL_API double process_message( const char* message, const void* param );

вместо

WHUSER_API double process_message( const char* message, const void* param );

везде заменить просто WHUSER_API на DLL_API и все объясни плз ?


и еще что за exe в UseDLL.rar ?
оно кстати не запускаеться и требует DLL.dll
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2011, 17:10     Перестает работать вывод в консоль в Release версии dll #17
Цитата Сообщение от nill Посмотреть сообщение
и еще что за exe в UseDLL.rar ?
оно кстати не запускаеться и требует DLL.dll
- это был тестовый проект, чтобы проверить работоспособность DLL, понятное дело что если запускал приложение в папке Release в которую не скопировал DLL, программа работать не будет (библиотека должна быть в одном каталоге с программой или же зарегестрий DLL в системе - тут смотри как это сделать http://ss64.com/nt/regsvr32.html)

Касательно твоего проекта по всей видимости трабла была здесь
C++
1
2
3
4
typedef double (*process_message_t)(const char* message, const void* param );//этот поинтер на функцию думаю лишним был
WHUSER_API double process_message( const char* message, const void* param );
 
#endif //к чему он???
nill
8 / 8 / 0
Регистрация: 16.08.2009
Сообщений: 417
22.08.2011, 01:30  [ТС]     Перестает работать вывод в консоль в Release версии dll #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
typedef double (*process_message_t)(const char* message, const void* param );//этот поинтер на функцию думаю лишним был WHUSER_API double process_message( const char* message, const void* param ); #endif //к чему он???

закоментировал typedef double (*process_message_t)(const char* message, const void* param );
ничего не изменилось при повторной загрузке длл ничего не пишеться в консоль, надо закрывать основное приложение и открывать заново

без #endif не компилиться
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 11:45     Перестает работать вывод в консоль в Release версии dll
Еще ссылки по теме:

C++ Перестает работать cout
Доходя до упорядочивания строк, программа перестает работать C++
Почему перестает работать программа при замене double на long double? C++

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

Или воспользуйтесь поиском по форуму:
gomodril
 Аватар для gomodril
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 102
10.05.2013, 11:45     Перестает работать вывод в консоль в Release версии dll #19
-=ЮрА=-, а почему не работает вывод cout и printf ?

Добавлено через 6 часов 28 минут
Все решилось, пишется:
C++
1
2
3
            {AllocConsole();
            FILE *hf = _fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),2 /*_O_TEXT*/),"w");
            *stdout = *stderr = *hf;
и cout начинает работать
Yandex
Объявления
10.05.2013, 11:45     Перестает работать вывод в консоль в Release версии dll
Ответ Создать тему
Опции темы

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