Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с функцией CopyFileEx(...)

8.6K
11 октября 2006 года
Xavier
69 / / 23.08.2006
У меня компилятор упорно игнорирует функцию указанную в сабже. Выдает следующее:
 
Код:
Compiling...
StdAfx.cpp
Compiling...
IBBackup.cpp
IBBackupDlg.cpp
H:\IBBackup\IBBackupDlg.cpp(302) : error C2065: 'CopyFileEx' : undeclared identifier
Generating Code...
Error executing cl.exe.
Creating browse info file...

Причём в Winbase.h она задефайнена... Просто не знаю, что делать.... Помогите кто-нибудь плиз!!!
309
12 октября 2006 года
el scorpio
1.1K / / 19.09.2006
А "автозаполнение" в редакторе кода отсутствует?
В Builder'е я набираю первые буквы, нажимаю [ctrl]+[space], а дальше редактор мне выводит все объявленные классы, переменные и функции.
Может оказаться, что благодаря директивам предпроцессора, "настоящее" имя функции нужно писать иначе: 'CopyFileExA' и или ещё как-нибудь
240
12 октября 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=Xavier]Причём в Winbase.h она задефайнена... Просто не знаю, что делать.... Помогите кто-нибудь плиз!!![/QUOTE]
Так а ты его подключаешь?
8.6K
12 октября 2006 года
Xavier
69 / / 23.08.2006
[QUOTE=aks]Так а ты его подключаешь?[/QUOTE]
В MSDN ясно написано:
 
Код:
Declared in Winbase.h; include Windows.h.
Кроме того функция CopyFile(...) так же объявлена в Winbase.h и там же задефайнена, однако она вполне нормально работает. Проблема есть только с CopyFileEx(...), замену которой я пока не нашёл, так как у последней, в отличии от CopyFile(...), есть возможность использования CallBack функции, получающей в параметрах состояние копирования, которое мне необходимо!
18K
12 октября 2006 года
casey
11 / / 18.07.2006
напиши в stdafx.h верхней строчкой
#define _WIN32_WINNT 0x0400
8.6K
12 октября 2006 года
Xavier
69 / / 23.08.2006
[QUOTE=casey]напиши в stdafx.h верхней строчкой
#define _WIN32_WINNT 0x0400[/QUOTE]
Кстати, интересно получается. В Winbase.h идёт макрокоманда
 
Код:
#ifdef (_WIN32_WINNT >= 0x0400)
...
#define CopyFileEx CopyFileExA
...
#define CopyFileEx CopyFileExW
...
#endif

По идее у меня автоматически должна работать эта функция, без дополнительного определения, т.к. в Windows.h Идёт как раз такая строка
 
Код:
#define _WIN32_WINNT 0x0400

Не пойму, почему компилятор на это не смотрит...
309
12 октября 2006 года
el scorpio
1.1K / / 19.09.2006
В общем, то, о чём я и догадывался.
Функции с суффиксом "A" используются для обработки символьных массивов ANSI (char*), а с суффиксом "W" - для 16-битных массивов (wchar_t*)

По причинам, понятным ему одному :eek:, компилятор "забывает", что используется предпроцессорное переопределение одного из вариантов имени :(.

В общем, пишите как есть - CopyFileExA
3
12 октября 2006 года
Green
4.8K / / 20.01.2000
Причины " понятные ему одному" находятся в настройках проекта и называются "Character Set".
А еще можно использовать макрос _T или TEXT.
8.6K
12 октября 2006 года
Xavier
69 / / 23.08.2006
[QUOTE=el scorpio]В общем, то, о чём я и догадывался.
Функции с суффиксом "A" используются для обработки символьных массивов ANSI (char*), а с суффиксом "W" - для 16-битных массивов (wchar_t*)

По причинам, понятным ему одному :eek:, компилятор "забывает", что используется предпроцессорное переопределение одного из вариантов имени :(.

В общем, пишите как есть - CopyFileExA[/QUOTE]
Ксати говоря и CopyFileExA и CopyFileExW тоже не хотели работать! Я проверял! Компилятор выдавал тоже самое - Undeclared identifier! А что для чего, я в принципе и сам знаю! Мне интересно, почему он игнорирует макроусловие #ifdef (_WIN32_WINNT >= 0x0400), хотя _WIN32_WINNT в Windows.h определено как 0x0400. А это хэдер включает в себя Winbase.h.... Непонятно...
3
12 октября 2006 года
Green
4.8K / / 20.01.2000
Ну зачем лезть туда, куда пока лучше не соваться?
Это я про Winbase.h.

Для того, чтобы использовать CopyFileEx достаточно подключить windows.h

А ещё нужно не сильно расчитывать на наши телепатические возможности и привести пример своего нестроящегося кода.

P.S. Что же касается Winbase.h, то _WIN32_WINNT тут не причем, смотри:
 
Код:
#ifdef UNICODE
#define CopyFileEx  CopyFileExW
#else
#define CopyFileEx  CopyFileExA
#endif // !UNICODE
8.6K
12 октября 2006 года
Xavier
69 / / 23.08.2006
Лан, этот трабл я решил! Вот Меня сейчас мучает другой: Данной функцией создаётся поток копирования файла, причем, чем n-ые промежутки вызывается callback-функция CopyProgressRoutine(...), в которой у меня идёт обработка информации о процессе копирования. Привожу код:
Код:
HWND hwndMainWin;
    HWND hwndProgrCtrl;
    HWND hwndProgress;
    CString sTFS;
    CString sTBT;
    sTFS.Format(_T("%i"), TotalFileSize);
    sTBT.Format(_T("%i"), TotalBytesTransferred);
    short FileSize = atoi(sTFS);
    short BytesTransferred = atoi(sTBT);

    hwndMainWin = FindWindow(NULL, "IBBackup");
    hwndProgrCtrl = GetDlgItem(hwndMainWin, IDC_COPY_PROGRESS);
    hwndProgress = GetDlgItem(hwndMainWin, IDC_PROGRESS);
    SetWindowText(hwndProgress, sTBT + " байт скопировано из " + sTFS);
SendMessage(hwndProgrCtrl, PBM_SETRANGE, 0, MAKELPARAM(0, (FileSize)));
SendMessage(hwndProgrCtrl, PBM_DELTAPOS, (WPARAM)(int)BytesTransferred , 0);
    return PROGRESS_CONTINUE;

Все вроде нормально, но вот индикатор прогресса не работает, только когда файл заканчивает копироваться он сразу полностью заполняется... В чём ошибка?
18K
12 октября 2006 года
casey
11 / / 18.07.2006
Возможно ты спутал сообщение, здесь надо PBM_SETPOS
18K
12 октября 2006 года
casey
11 / / 18.07.2006
[QUOTE=Green]Ну зачем лезть туда, куда пока лучше не соваться?
Это я про Winbase.h.

Для того, чтобы использовать CopyFileEx достаточно подключить windows.h

А ещё нужно не сильно расчитывать на наши телепатические возможности и привести пример своего нестроящегося кода.

P.S. Что же касается Winbase.h, то _WIN32_WINNT тут не причем, смотри:
 
Код:
#ifdef UNICODE
#define CopyFileEx  CopyFileExW
#else
#define CopyFileEx  CopyFileExA
#endif // !UNICODE
[/QUOTE]


Просто так не будет работать, там в MSDN (CreateFileEx) написано даж
To compile an application that uses this function, define the _WIN32_WINNT macro as 0x0400 or later. For more information, see Using the SDK Headers.
8.6K
12 октября 2006 года
Xavier
69 / / 23.08.2006
[QUOTE=casey]Возможно ты спутал сообщение, здесь надо PBM_SETPOS[/QUOTE]
Нет, просто я уже разными способами пробовал и код загнал пробный.
А так, ошибку я уже нашёл сам: Progress Control просто не поддерживает Range больше чем 65535 пришлось FileSize и BytesTransferred поделить на 131072 - теперь всё работает!!!
5.9K
13 октября 2006 года
Zushenskiy
161 / / 29.06.2006
[COLOR=Red]Проблема CopyFileEx[/COLOR]

Ребята вы MSDN читаете? Там ясно написано чтобы ипользовать эту функцию необходимо обьявить _WIN32_WINNT как 0x0400 версию или более позднюю. И причем тут A или W для этого есть макроопределения UNICOD которое определяется в зависимости от типа кодировки установленной в проекте. A CopyFileEx это лишь typedef CopyFileExA или CopyFileExW в зависимости от макроопределения. и если бы была прблема с A и W то компилятор ругался бы на приведение типов char к wchar_t или наоборот.
Если хочешь более подробно узнать сущность _WIN32_WINNT читай MSDN. Но в кратце это макрос определяющий под какой виндой ты осуществляешь компиляцию и автоматом он не определен. и то что вы смотрете по поводу winbase.h это серидина кода которая не используеться потомучто не определена _WIN32_WINNT, где то перед есть #ifdef _WIN32_WINNT.:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог