Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
1

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

19.08.2011, 07:15. Показов 2631. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
компилю 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;
 
}
когда компилю в дебаг версию таких проблем нет отключать и подключать длл можно сколько угодно вывод в консоль работает
в релиз версии все работает только при первом подключении длл к проге
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2011, 07:15
Ответы с готовыми решениями:

Ошибка DLL в Release версии приложения
Я написал DLL hiper.dll, подключил её к своему приложению через LoadLibrary. В Debug версии всё...

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

В функции перестаёт работать вывод терминал многострочный текст записанный HEREDOC (без эскейп-последовательностей)
Доброго времени суток! Помогите пожалуйста разобраться. Нашёл решение как вывести многострочный...

Таймер не работает в Release версии
Написал я курсач, но всё пашет только при запуске приложения из Visual Studio. После того, как я...

18
Заблокирован
Автор FAQ
19.08.2011, 09:33 2
Зачем обрабатываешь ATTACH и DETACH всё равно ничего особо нужного ты в кэйзах не делаешь?Попробуй simple DLL
C++
1
2
3
4
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
1
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
19.08.2011, 10:22  [ТС] 3
-=ЮрА=-,

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

а без AllocConsole();;
консольного окна вообще не будет у меня же длл а не консольное приложение
0
Заблокирован
Автор FAQ
19.08.2011, 10:36 4
nill, посмотри сюда Помогите с подключением dll к проекту
А так лучше какую то часть кода выложи, искать баг не видя код сложно
1
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
19.08.2011, 10:37 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;
        }
?
0
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
19.08.2011, 10:49  [ТС] 6
-=ЮрА=-,
тему посмотрел но как то ничего не нашел, можешь сюда скопировать что мне в код вставить
А по своему коду я с радостью бы выложил но что конкретно нужно ?
у меня все работает кроме вот этого бага с выводом текста в консоль при повторном подключении длл когда она скомпилена в release версии
в тхт все пишеться как обычно все работает только в консоли ничего не появляться


Евгений М.,
При подключении длл консольное окно появяеться
А видимо когда начинается работа с ним оно резко пропадает и потом вообще вся прога зависает
0
Заблокирован
Автор FAQ
19.08.2011, 11:00 7
Цитата Сообщение от nill Посмотреть сообщение
у меня все работает кроме вот этого бага с выводом текста в консоль при повторном подключении длл когда она скомпилена в release версии
- напиши клиента для DLL, я никогда не встречал чтобы DLL ещё и консоь выкидывала, один раз пробовал ввести в DLL встроенній shlobj - диалог - и всё окнчилось крахом, думаю с консолью в релизе тоже, в дебаге отрабатывает потому что это тестовый режим и во многом там сама студия тебе помогает, в ОС всё сложней и никаких механизмов фильтрации ошибок нет вот и опрокидывается твоё приложение
1
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
19.08.2011, 11:18  [ТС] 8
-=ЮрА=-,
код клиента это ты имешь ввиду то приложение к которому я подключаю свою длл ?
если да то оно не мое кода у меня нет, но врятли в нем проблема
все глюки всегда из за моей длл
0
Заблокирован
Автор FAQ
19.08.2011, 11:27 9
Код своей длл, упрости его и давай на рассмотрение, да я имел ввиду именно
Цитата Сообщение от nill Посмотреть сообщение
приложение к которому я подключаю свою длл
1
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
19.08.2011, 11:30  [ТС] 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){
 
}//в этой функции весь основной код
0
Заблокирован
Автор FAQ
19.08.2011, 11:43 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 );
- этой функции вообще нет, не хочешь показывать функции не показывай, но хотя бы в их прототипах оставь часть кода чтобы посмотреть как ты внутри тела параметры юзаешь...
1
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
19.08.2011, 11:58  [ТС] 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;
 
}
0
Заблокирован
Автор FAQ
19.08.2011, 12:20 13
Цитата Сообщение от nill Посмотреть сообщение
++m_ndx
- а переменные какие ещё в проекте, хотябы типы приведи, к примеру напишу

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

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

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

process_message(testMSG,testParam) : 0.000000
Press any key to continue
Вложения
Тип файла: rar DLL.rar (27.1 Кб, 12 просмотров)
Тип файла: rar UseDLL.rar (37.0 Кб, 11 просмотров)
1
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
19.08.2011, 22:39  [ТС] 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
0
Заблокирован
Автор FAQ
21.08.2011, 17:10 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 //к чему он???
0
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
22.08.2011, 01:30  [ТС] 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 не компилиться
0
6 / 6 / 0
Регистрация: 10.10.2012
Сообщений: 140
10.05.2013, 11:45 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 начинает работать
0
10.05.2013, 11:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2013, 11:45
Помогаю со студенческими работами здесь

Можно ли работать с проектами созданными в версии 2013 на версии Visual Studio 2017?
Т.е. открывает и работает ли Visual Studio 2017 с проектами более ранних версий? Как Вам 2017...

Сбор release версии программы с++, на MinGW
Есть такая проблема: компилирую программу из под Windows 7, на MinGW g++ -o test.exe test.cpp...

Сбой только в Release-версии. Почему?
Может, кто-то сталкивался с такой проблемой: Во время работы Release-версии приложения при его...

Почему, когда переключаю программу в Release, перестаёт срабатывать событие onChange у компонента CCalendar?
И вообще календарь перестаёт переключаться, в смысле, на мышь не реагирует, когда на число...

Файл myprojectname.pdb в каталоге Release версии !
Как убрать вездесущий файл расширения &quot;.pdb&quot; из визуал стидии в настройках. Он мне не очень мешает,...

Release версии программ висят в процессах и ничего не делают
При отладке Debug и Release компилируется и запускается нормально. Однако если из папки Release...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru