Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077

Создание связного списка из данных типа LPCWSTR

14.09.2009, 21:35. Показов 1579. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация:
переменная WIN32_FIND_DATA ffd, в ней есть параметр WCHAR cFileName (как определено в WinSDK).
Есть структура - Связный список, инициализированный как myList<LPCWSTR> DirList;

в цикле

C++
1
2
3
4
do
{
   DirList.Insert(ffd.cFileName);
} while (FindNextFile(h, &ffd);
В результате - все члены в связном списке имеют одинаковое значение, последнее, найденное в FindNextFile... Пробовал в методе Insert руками прописывать вывод всех членов до текущего добавленного, и выглядело это так:
читается первый каталог: recycled.bin
читается второй каталог: bin, bin
читается третий каталог: boot, boot, boot

Это потому, как я понял, что ffd всё время имеет один адрес в памяти, и все члены списка ссылаются на одну память. Я пошёл другим путём, пытаясь скопировать данные в определённую до этого переменную (инициализировал её как в цикле, так и в самом начале функции, в которой это описано всё):

C++
1
2
3
4
5
6
do
{
   LPWSTR ddd[260];
   *ddd = ffd.cFileName;
   DirList.Insert(*ddd);
} while (FindNextFile(h, &ffd);
И о ужас! Ничего не изменилось...

Пробовал как-то так копировать данные:

C++
1
2
3
4
5
6
do
{
   LPWSTR ddd[260];
   StringCchCopy(*ddd, 260, ffd.cFileName);
   DirList.Insert(*ddd);
} while (FindNextFile(h, &ffd);
Также - компилируется нормально, НО вылетает программа... Сразу появляется отчёт об отправке ошибок в Майкрософт (отправил разок, когда запарило). Появляется именно в момент исполнения функции StringCchCopy();

Собственно вопрос - подскажите, где я не прав? И что сделать, чтобы это работало?

Добавлено через 2 минуты
Да, кстати, если сделать так:

C++
1
2
3
4
5
6
7
myList<int> DirList;
int i = 0;
do
{
   DirList.Insert(i);
   i++;
} while (FindNextFile(h, &ffd);
то всё прекрасно работает...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.09.2009, 21:35
Ответы с готовыми решениями:

Аргумент типа const char* не совместим с параметром типа LPCWSTR
Начал учить win32 по книге Финогенова, вставил код первой проги в VS10, пишет мне ошибку &quot;аргумент типа const char* не совместим с...

Создание двойного связного списка целых чисел, вводимых с клавиатуры; печать списка
Люди помогите, нужно сдать последнюю Лабу. Задача: Написать программу которая создает двойной связный список целых цисел, вводимых с...

Создание связного списка
нужно создать связной список, что собственно уже сделал. что нужно: -функции: -root (выводит список) -push (+1 елемент в...

7
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
14.09.2009, 21:46
Разумеется, ты не прав. Нужно примерно так (не проверял!):
C++
1
2
3
4
5
6
do
{
   LPWSTR ddd = new WCHAR[wcslen(ffd.cFileName) + 1];
   wcscpy(ddd, ffd.cFileName);
   DirList.Insert(ddd);
} while (FindNextFile(h, &ffd);
Ну и, разумеется, не забыть про operator delete[] для каждого элемента при разрушении списка.
Я бы считал более удачным выбором сконструировать myList<wstring> DirList; с соответствующей коррекцией кода.
1
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
14.09.2009, 21:47  [ТС]
CheshireCat, спасибо. Завтра буду на работе - попробую Про разрушение, конечно же, не забываю
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
15.09.2009, 10:16  [ТС]
О ужас... И так не работает... Даже не компилируется. Пошаманил чуть-чуть, но бубна определённо не хватает. Сейчас буду дальше читать МСДН, но также жду вашей скоропостижной помощи...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.09.2009, 10:58
Хм, ну, для скоропостижной помощи приведи проблемный код. Поглядим-с...
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
15.09.2009, 11:31  [ТС]
Последнее, что висит в редакторе кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
myList<LPCWSTR> DirList;
 
    hFind = FindFirstFile(FileMask, &ffd);
 
    LPWSTR ddd[MAX_PATH];
 
    if (hFind != INVALID_HANDLE_VALUE)
    do
    {
        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            StringCchCopy(new ddd, MAX_PATH, ffd.cFileName);
            //printf("%a", *ffd.cFileName);
           &nbsp;DirList.InsertElement(*ddd);
        }
    } while (FindNextFile(hFind, &ffd));
    FindClose(hFind);
Сам связный список представляет из себя обычный шаблон класса, точнее двух классов, один хранит в себе первый и последний ссылку на элементы, а второй - собственно класс, хранящий значение одного элемента, на этот второй класс и ссылаются элементы первого класса....

Добавлено через 4 минуты
При отладке запинается на следующей строке (из файла strsafe.h):

C++
1
2
3
4
5
6
7
8
    while (cchDest && cchToCopy && (*pszSrc != L'\0'))
    {
        [COLOR="Red"]*pszDest++ = *pszSrc++;[/COLOR]
        cchDest--;
        cchToCopy--;
 
        cchNewDestLength++;
    }
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.09.2009, 12:16
Ну, ты наворотил! Вот правильный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    myList<LPCWSTR> DirList;
 
    hFind = FindFirstFile(FileMask, &ffd);
 
    //LPWSTR ddd[MAX_PATH];
 
    if (hFind != INVALID_HANDLE_VALUE)
    do
    {
        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            LPWSTR ddd = new WCHAR[MAX_PATH];
            HRESULT hr = StringCchCopy(ddd, MAX_PATH, ffd.cFileName);
            ASSERT(SUCCEEDED(hr));
            //printf("%a", *ffd.cFileName);
            if (SUCCEEDED(hr))
                DirList.InsertElement(ddd);
            else
                delete[] ddd; // или как-то иначе обработать ошибку...
        }
    } while (FindNextFile(hFind, &ffd));
    FindClose(hFind);
2
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
15.09.2009, 12:34  [ТС]
CheshireCat, странно, до этого ругался на строку ... new WCHAR[MAX_PATH], а сейчас нет...
В общем ясно, надо думать головой, и не программировать одновременно в С++ и 1С... 1С разрушает моск...


CheshireCat, огромное человеческое спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2009, 12:34
Помогаю со студенческими работами здесь

Создание и сортировка связного списка
Задание: Написать программу, реализующую связный список с информацией о сотрудниках и отображающую список в порядке возрастания возраста...

Аргумент типа char * несовместим с параметром типа lpcwstr
Как решить ошибку компиляции, на втором компьютере студия ошибок не вызывает, что странно. #include &lt;iostream&gt; #include...

Создание списка/массива типа класса
Задача - Получить n'ое количество объектов с типом моего класса. Код класса: public class MFile { short Id;...

Создание списка с 2 полями разного типа
Здравствуйте. Подскажите пожалуйста, как можно создать список с 2 полями разного типа?

Создание списка типа созданного класса
у меня стоит такая задача, что нужно расставить 10 объектов, координаты которых не должны совпадать с координатами других объектов и друг с...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru