Новая запара GRRRL Power выручай дружище, без тебя никак ((

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DarkLight, 6 Jul 2012.

  1. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    Не работает данная структура
    PHP:
    // octopus.cpp: определяет точку входа для консольного приложения.
    #include "stdafx.h" 
    #include "headers.h"
    using namespace std;

    int filesAndFolders(char bb[5])
    {    
        
        
    WIN32_FIND_DATA FindFileData;
        
    HANDLE hf;
        
    hf=FindFirstFileA(bb, &FindFileData);
        if (
    hf!=INVALID_HANDLE_VALUE)
        {
            do
            {
                
    cout << FindFileData.cFileName << endl;
            }
            while (
    FindNextFile(hf,&FindFileData)!=0);
            
    FindClose(hf);
        }
        return 
    0;
    }
    int main()
    {        
        
    int n;    
        
    char dd[4], bb[5];
        
    char d;     
        
    DWORD dr GetLogicalDrives();
        for( 
    int i 026i++ ) 
        { 
            
    = ((dr>>i)&0x00000001);
            if( 
    == )
            { 
                
    dd[0] = char(65+i);
                
    dd[1] = ':';
                
    dd[2] = '\\';
                
    dd[3] = 0;

                
    bb[0] = char(65+i);
                
    bb[1] = ':';
                
    bb[2] = '\\';
                
    bb[3] = '*';
                
    bb[4] = 0
                
                
    GetDriveTypeA(dd);
                if( 
    == DRIVE_FIXED )  
                {
                     
    filesAndFolders(bb);
                }
            }
        }
        return(
    0);
    }
    1>octopus.cpp(11): error C2664: FindFirstFileA: невозможно преобразовать параметр 2 из "WIN32_FIND_DATA *" в "LPWIN32_FIND_DATAA"

    при замене на такое

    PHP:
        hf=FindFirstFile(bb, &FindFileData);

    1>octopus.cpp(11): error C2664: FindFirstFileW: невозможно преобразовать параметр 1 из "char []" в "LPCWSTR"


    при замене на такое

    PHP:
    hf=FindFirstFile(LPCWSTR(bb), &FindFileData);
    Компилится и ничего не отображается

    при замене на такое

    PHP:
    hf=FindFirstFile(L"C:\\*", &FindFileData);
    Компилится но отображаются вместо названий файлов и папок совершенно одинаковый набор символов например 0012FD44 для всех файлов и папок, а надо нормальные имена.

    Вопрос что делать? Где исправлять? Ещё чутка и придётся новую клаву с мышью покупать.. Короче нид HELP!!!
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Попробуй то, что посоветовали в предыдущей теме.
    Также в MSDN по WIN32_FIND_DATA написано:
    Насчет
    Здесь написано, почему так происходит.
     
  3. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    ))

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

    PHP:
    hf=FindFirstFile(L"C:\\*", &FindFileData);  
    а мне надо что бы через переменную

    поигрался с

    WIN32_FIND_DATAW (Unicode) and WIN32_FIND_DATAA (ANSI)

    эффект тот же

    Блин уже думаю либо проект на VS6 доделывать придётся всё таки либы подключать для регулярок, что то не вставляет VS10
     
    #3 DarkLight, 6 Jul 2012
    Last edited: 6 Jul 2012
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Если ты хочешь, чтобы твоя программа работала в кодировке ANSI, поставь в начало макрос, как я показал, или ко всем именам функций букву "A" в конец приписывай. Читай предыдущую тему, короче. Только вот ANSI - это прошлый век.

    Это потому что ты все правильно написал, поставив L перед путем, только вот std::cout, который ты импользуешь, не умеет выводить юникодовые строки (wchar_t*), он выводит только их адреса. Замена cout на wcout решит проблему, только тогда перед всеми статическими строками надо будет написать букву L.

    Мой совет: использовать юникод (что по умолчанию и предлагают новые студии), не писать никакие постфиксы у имен функций, а перед всеми строками ставить либо букву L, типа:

    PHP:
    L"привет"
    либо обрамлять их в макрос TEXT, раскрывающийся в ту же L для юникодной программы:

    PHP:
    TEXT("привет")
    что, в общем-то, более универсально и позволит потом программу собрать как для ANSI, так и для UNICODE. Хотя кому это сейчас может быть нужно - ума не приложу. Я давно уже испольщую только юникод.
     
    #4 GRRRL Power, 6 Jul 2012
    Last edited: 6 Jul 2012
    4 people like this.
  5. leeex

    leeex New Member

    Joined:
    26 Jul 2011
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    Тебе надо компилировать программу без юникода. Чтобы компилятор сам выбирал ANSI вариант функций. Либо используй переменные нужного типа. А вообще попробуй почитать что тебе пишет компилятор.
     
  6. DarkLight

    DarkLight New Member

    Joined:
    13 Jan 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    =)

    Спасибо всем за поддержку и советы. Вопросы ещё будут, не сомневайтесь...
     
  7. enigma

    enigma Member

    Joined:
    10 Jul 2011
    Messages:
    80
    Likes Received:
    15
    Reputations:
    7
    Можно попробовать создать класс Unicode чтоб работал как с простой так и с юникодной строкой

    Code:
    #include <Windows.h>
    #include <xstring>
    
    typedef std::basic_string<TCHAR, std::char_traits<TCHAR>,std::allocator<TCHAR>>Unicode;
    int main()
    
    {
    	Unicode buf = L"asd";
    	MessageBoxW(0,buf.c_str(),L"",0);
    
    }