2015-08-02 2 views
-2

мне нужно найти файлы с определенными расширениями, например, * .doc, * .docx Во-первых, я ищу все файлыFindFirstFile COUT проблемы

lstrcat(szPath, L"*"); 
hFind = FindFirstFile(szPath, &fdFindData); 

Затем я сравниваю основан файл с расширением я нужно

PCWSTR str1 = L".doc"; 

if(NULL != StrStr(fdFindData.cFileName,str1)) { 
     FoundFileFunction(fdFindData.cFileName); 
     } 

И затем я получил проблему с соиЬ

VOID FoundFileFunction(HANDLE hFile) 
{ 
    std::cout<<hFile; 
} 

Это выход:

009AE50000 
009AEB0000 
009AEBBB00 

и так далее. В чем проблема?

+0

Когда я использую «std :: wcout», я получил - 00ABECA4 – Lannser

+1

Что вы ожидали от печати «РУЧКИ»? Вы должны сказать нам, что вы хотели сделать, поскольку этот код (по собственному признанию) не делает этого. –

+0

Недостаток из-за отсутствия исследований (см. Мой ответ). –

ответ

1

WIN32_FIND_DATA::cFileName is a TCHAR[MAX_PATH], а не HANDLE.
Я не знаю, почему вы написали HANDLE, так как это не указано на странице документации даже один раз.

Ваша функция пытается распечатать имя файла C-string, как если бы это был HANDLE, который является другим видом указателя на TCHAR*. Он не знает, чтобы взять указатель как TCHAR*, так что он не знает, что вы хотите, чтобы он форматировал вывод в виде строки. Он может знать только для печати адреса, представленного указателем.

Ваша функция FoundFileFunction должна принимать TCHAR*.

Проблема была бы автоматически обнаружена, если бы вы использовали STRICT режим. Если (например) NO_STRICT определено, то HANDLE является псевдонимом для void*, который согласно правилам языка может быть инициализирован неявно с TCHAR*. Вы всегда должны compile with STRICT defined: это изменило бы типы, которые должны быть неявно конвертируемыми друг к другу, и вы получили бы ошибку компиляции для своей ошибки.

Кроме того, если ваша программа использует Unicode, то TCHAR не char но wchar_t, так что вам нужно использовать не std::cout но std::wcout.

+0

Да, спасибо, проблема решена! – Lannser

+2

«Я удивлен, что это скомпилировано». Если 'STRICT' не определен, например, если определено' NO_STRICT', 'HANDLE' является typedef для' void * ', что позволит использовать' TCHAR [] '/ 'TCHAR *', который будет передан там, где ожидается «РУЧКА». Вы всегда должны компилироваться с 'STRICT', чтобы распознавать ошибки кодирования, подобные этому. См. [Проверка типа STRICT] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383732.aspx). –

+0

@ Lannser: Вы примете ответ? –

Смежные вопросы