DragQueryFiles не может получить путь к файлу - PullRequest
0 голосов
/ 28 сентября 2018

Мой код:

void CWGAccountFilterDlg::OnDropFiles(HDROP hDropInfo)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CDialogEx::OnDropFiles(hDropInfo);
    wchar_t lpFilePath[MAX_PATH] = { 0 };
    int nCount = DragQueryFile(hDropInfo, -1, NULL, 0);
    DragQueryFile(hDropInfo, nCount, lpFilePath, _countof(lpFilePath));
    DragFinish(hDropInfo);
    GetDlgItem(IDC_EDIT_FILE)->SetWindowText(lpFilePath);
    m_FilePath.Format(L"%s", lpFilePath);
}

При втором вызове DragQueryFile возвращается 0 (эта ситуация верна), а lpFilePath (это не ожидание) не содержит данных.Я уверен, что значение nCount допустимо, переполнение буфера отсутствует.

В диалоговом окне и управлении CEdit все параметры 'accept files' установлены в true.И есть класс с именем CMyEdit реализовать из CEdit, и обработал функцию OnDropFiles.

1 Ответ

0 голосов
/ 28 сентября 2018

Из документации для DragQueryFileW :

Индекс файла для запроса.Если значение этого параметра равно 0xFFFFFFFF, DragQueryFile возвращает количество удаленных файлов.Если значение этого параметра находится между нулем и общим количеством удаленных файлов, DragQueryFile копирует имя файла с соответствующим значением в буфер, на который указывает параметр lpszFile.

Во втором вызовеDragQueryFile, второй параметр должен быть между 0 и nCount.Проверьте значение nCount, чтобы убедиться, что оно больше нуля, и передайте ноль, если вас интересует только первый файл.

Предполагается, что удаляется только один файл.Если файлов больше, добавьте цикл.

int nCount = DragQueryFile(hDropInfo, -1, NULL, 0);
if (nCount > 0)
{
    //(add a loop to get multiple files)
    DragQueryFile(hDropInfo, 0, lpFilePath, _countof(lpFilePath));
    GetDlgItem(IDC_EDIT_FILE)->SetWindowText(lpFilePath);
    m_FilePath.Format(L"%s", lpFilePath);
}
DragFinish(hDropInfo);
...