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...
Проблема с функцией CopyFileEx(...)
Код:
Причём в Winbase.h она задефайнена... Просто не знаю, что делать.... Помогите кто-нибудь плиз!!!
В Builder'е я набираю первые буквы, нажимаю [ctrl]+[space], а дальше редактор мне выводит все объявленные классы, переменные и функции.
Может оказаться, что благодаря директивам предпроцессора, "настоящее" имя функции нужно писать иначе: 'CopyFileExA' и или ещё как-нибудь
Так а ты его подключаешь?
В MSDN ясно написано:
Код:
Declared in Winbase.h; include Windows.h.
#define _WIN32_WINNT 0x0400
#define _WIN32_WINNT 0x0400[/QUOTE]
Кстати, интересно получается. В Winbase.h идёт макрокоманда
Код:
#ifdef (_WIN32_WINNT >= 0x0400)
...
#define CopyFileEx CopyFileExA
...
#define CopyFileEx CopyFileExW
...
#endif
...
#define CopyFileEx CopyFileExA
...
#define CopyFileEx CopyFileExW
...
#endif
По идее у меня автоматически должна работать эта функция, без дополнительного определения, т.к. в Windows.h Идёт как раз такая строка
Код:
#define _WIN32_WINNT 0x0400
Не пойму, почему компилятор на это не смотрит...
Функции с суффиксом "A" используются для обработки символьных массивов ANSI (char*), а с суффиксом "W" - для 16-битных массивов (wchar_t*)
По причинам, понятным ему одному :eek:, компилятор "забывает", что используется предпроцессорное переопределение одного из вариантов имени :(.
В общем, пишите как есть - CopyFileExA
А еще можно использовать макрос _T или TEXT.
Функции с суффиксом "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.... Непонятно...
Это я про Winbase.h.
Для того, чтобы использовать CopyFileEx достаточно подключить windows.h
А ещё нужно не сильно расчитывать на наши телепатические возможности и привести пример своего нестроящегося кода.
P.S. Что же касается Winbase.h, то _WIN32_WINNT тут не причем, смотри:
Код:
#ifdef UNICODE
#define CopyFileEx CopyFileExW
#else
#define CopyFileEx CopyFileExA
#endif // !UNICODE
#define CopyFileEx CopyFileExW
#else
#define CopyFileEx CopyFileExA
#endif // !UNICODE
Код:
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;
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;
Все вроде нормально, но вот индикатор прогресса не работает, только когда файл заканчивает копироваться он сразу полностью заполняется... В чём ошибка?
Возможно ты спутал сообщение, здесь надо PBM_SETPOS
Это я про Winbase.h.
Для того, чтобы использовать CopyFileEx достаточно подключить windows.h
А ещё нужно не сильно расчитывать на наши телепатические возможности и привести пример своего нестроящегося кода.
P.S. Что же касается Winbase.h, то _WIN32_WINNT тут не причем, смотри:
Код:
#ifdef UNICODE
#define CopyFileEx CopyFileExW
#else
#define CopyFileEx CopyFileExA
#endif // !UNICODE
#define CopyFileEx CopyFileExW
#else
#define CopyFileEx CopyFileExA
#endif // !UNICODE
Просто так не будет работать, там в 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.
Нет, просто я уже разными способами пробовал и код загнал пробный.
А так, ошибку я уже нашёл сам: Progress Control просто не поддерживает Range больше чем 65535 пришлось FileSize и BytesTransferred поделить на 131072 - теперь всё работает!!!
Ребята вы 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.:)