15 / 12 / 3
Регистрация: 25.10.2018
Сообщений: 113
1

Ошибки в окне консоли

27.10.2018, 20:57. Показов 732. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил разобраться в том, как можно было бы создать диалоговое окно для выбора папки пользователем. Нашёл функцию на форуме. Закомментировал некоторые моменты для себя в программе, подготовил входные параметры: заголовки, макросы для её работы. Запустил, работает, но выводятся неприятные ошибки (см. в прикреплённом изображении).
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#define _CRT_SECURE_NO_WARNINGS
#define NO_WIN32_LEAN_AND_MEAN
//Макросы для перевода символов в юникод (присутствуют для обратной совместимости исходника)
#define __T(x) L ## x
#define _T(x) __T(x)
 
#include <iostream>
//Библиотеки для работы с диалоговым окном
#include <shlobj.h>
#include<tchar.h>
 
using namespace std;
//////////////////////////////////////////////////////////////////////////////
// Диалог выбора папки                                                     //                                           
// Входные параметры:                                                       //
//  Owner   - дексриптор окна - владельца (В моём случае рабочего стола) // 
//   pTitle  - указатель на заголовок диалога, может быть NULL              //
//   pBuffer - указатель на буфер-получатель, может быть NULL,               //
//   в этом случае функция сама зарезервирует память под буфер,                //
//   но в дальнейшем его необходимо вручную удалить функцией LocalFree      //
// Возвращаемое значение:                                                   //
//  указатель на массив символов, содержащий путь                            //
//////////////////////////////////////////////////////////////////////////////
LPTSTR SelectFolder(HWND hOwner, LPTSTR pTitle, LPTSTR pBuffer)
{
    LPTSTR pResult;
    BROWSEINFO bi;
    TCHAR s[MAX_PATH];
    ITEMIDLIST* ResultPIDL = 0;
    if (hOwner != NULL)
    {
        if (pBuffer == NULL)
        {
            // необходимо зарезервировать буфер
            pResult = (LPTSTR)LocalAlloc(LPTR, MAX_PATH * sizeof(TCHAR));
            if (pResult == NULL)
            {
                // не удалось зарезервировать память
                return NULL;
            }
        }
        else {
            pResult = pBuffer;
        }
        bi.hwndOwner = hOwner;
        bi.pidlRoot = NULL;
        bi.pszDisplayName = s;
        bi.lpszTitle = pTitle;
        bi.ulFlags = BIF_RETURNONLYFSDIRS;
        bi.lpfn = NULL;
        ResultPIDL = SHBrowseForFolder(&bi);
        if (ResultPIDL != NULL) {
            // пользователь выбрал папку
            int lastchar;
            SHGetPathFromIDList(ResultPIDL, pResult);
            if ((lastchar = _tcslen(pResult)) != 0) {
                if ((pResult[lastchar - 1] != _T('\\')) && (lastchar != MAX_PATH))
                    pResult[lastchar] = _T('\\');
            }
        }
        else
        {
            // Пользователь закрыл окно
            if (pBuffer == NULL)                            // Если место не предлагалось в качестве параметра
                LocalFree(pResult);                         // Пробуем освободить место, выделенное внутри этой функции
            else
                *pResult = 0;                               // Сброс значения указателя
            pResult = NULL;                                 // Сброс указателя (ни на что не указывает)
        }
    }
    else
    {
        // Ошибка - не задано окно владельца
        if (pBuffer != NULL) *pBuffer = 0;                  // Очистка буфера
        pResult = NULL;
    }
    return pResult;
}
 
int main()
{
    LPCTSTR lUnicode = "Выберите папку";
    HWND hWnd = GetDesktopWindow();
    LPCTSTR buffer = new TCHAR[500];                        // Выделение места для пути к папке
    SelectFolder(hWnd, (LPTSTR)lUnicode, (LPTSTR)buffer);
    delete buffer;
    system("pause");
    return 0;
}
Предполагаю, что делает это вызов функции SHBrowseForFolder или SHGetPathFromIDList, но не утверждаю, так как не искал бы код для своей цели.
Миниатюры
Ошибки в окне консоли  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2018, 20:57
Ответы с готовыми решениями:

Перемещение символа в окне консоли
помогите плиз, здесь нужно что б символ бегал по екрану, а не рисовал. #include &lt;iostream&gt;...

Как в консоли или в окне winapi отображать определенный набор букв из стандарта unicode?
Как в консоли или в окне winapi отображать определенный набор букв из стандарта unicode?

Прогресс в окне консоли
Всем доброго времени суток! Тестирую вот такую подпрограммку, чтобы можно было наблюдать...

Позиционирование встроенной консоли в окне
Суть проблемы: мне необходимо встроить консоль в GUI окно, все в принципе понятно, но не понятно...

2
7648 / 6454 / 2943
Регистрация: 14.04.2014
Сообщений: 28,135
27.10.2018, 23:59 2
Release версию попробуй и сделай нормальное Windows-приложение.
1
15 / 12 / 3
Регистрация: 25.10.2018
Сообщений: 113
28.10.2018, 01:36  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Release версию попробуй и сделай нормальное Windows-приложение.
Я тоже думаю, что надо сделать классическое приложение Windows, там в проекте все необходимые библиотеки собраны для работы с оконными приложениями, а то в консольном появляется олдскульное логирование, которое замучаешься отключать.
0
28.10.2018, 01:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2018, 01:36
Помогаю со студенческими работами здесь

Отрисовка графики в окне из консоли
Здравствуйте,

Правильный показ Ascii в окне консоли [Delphi 7]
как настроить правильний показ Ascii(русского шлифта), в окне консоли Delphi 7.

Отобразить в окне консоли аргументы командной строки в обратном порядке
отобразить в окне консоли аргументы командной строки в обратном порядке for( int i = args.length...

В окне консоли вместо нужных значений выводятся нули или единицы
При написании программы столкнулся с проблемой такого плана. Делал лабораторную работу 21 задание,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru