Russian Qt Forum
Апрель 26, 2024, 01:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: copyFileEx+winapi  (Прочитано 17678 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Март 28, 2015, 10:15 »

Здравствуйте вопрос в следующем
почему copyfile winapi
не копирует системный файл

так копируеи

Код
C++ (Qt)
LPCSTR q=QString("C:\\am74364.dll").toLocal8Bit().data();
 
 
   LPCSTR a=QString("C:\\a\\am74364.dll").toLocal8Bit().data();
 
   BOOL ok=true;
 
  CopyFileA(q,a,ok);

а так нет..
Код
C++ (Qt)
LPCSTR q=QString("C:\\pagefile.sys").toLocal8Bit().data();
 
 
   LPCSTR a=QString("C:\\a\\pagefile.sys").toLocal8Bit().data();
 
   BOOL ok=true;
 
  CopyFileA(q,a,ok);
« Последнее редактирование: Март 28, 2015, 18:49 от koldun90 » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 28, 2015, 10:23 »

Странно...

А почему не воспользуйтесь Qt?
Код
C++ (Qt)
QFile::copy("/path/file", "/path/copy-of-file");
Записан

Bepec
Гость
« Ответ #2 : Март 28, 2015, 10:27 »

Не тормози, ошибку посмотри, нам напиши и довольный уходи Веселый
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #3 : Март 28, 2015, 11:47 »

мне не понятно как использовать еще функцию CopyFileEx

Код
C++ (Qt)
BOOL CopyFileEx(
 LPCTSTR lpExistingFileName,           // имя существующего файла
 LPCTSTR lpNewFileName,                // имя нового файла
 LPPROGRESS_ROUTINE lpProgressRoutine, // функция обратного вызова
 LPVOID lpData,                        // параметры обратного вызова
 LPBOOL pbCancel,                      // отмененный статус
 DWORD dwCopyFlags                     // опции копирования
);
 
первый и второй параметр понятно
 LPPROGRESS_ROUTINE lpProgressRoutine, // функция обратного вызова
  LPVOID lpData,                        // параметры обратного вызова

функцию обратного вызова я должен сам в проекте определить правильно?
LPVOID lpData,                        // параметры обратного вызова   -- и что нужно указывать в параметрах обратного вызова)

Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #4 : Март 28, 2015, 11:50 »

в mainwindow.h написал определил свою функцию

Код
C++ (Qt)
DWORD CALLBACK CopyProgressRoutine(
   LARGE_INTEGER TotalFileSize,
   LARGE_INTEGER TotalBytesTransferred,
   LARGE_INTEGER StreamSize,
   LARGE_INTEGER StreamBytesTransferred,
   DWORD dwStreamNumber,
   DWORD dwCallbackReason,
   HANDLE hSourceFile,
   HANDLE hDestinationFile,
   LPVOID lpData);

в mainwindow.cpp

Код
C++ (Qt)
DWORD CALLBACK MainWindow::CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
                                                  LARGE_INTEGER TotalBytesTransferred,
                                                  LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
{
 
 
 
         return PROGRESS_CONTINUE;
}

вот только мне не понятно как мне вызывать функцию copyfileEx
Код
C++ (Qt)
CopyFileExA(q,a,&CopyProgressRoutine,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS);

Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #5 : Март 28, 2015, 11:56 »

Код
C++ (Qt)
DWORD CALLBACK CopyProgressRoutine(
 LARGE_INTEGER  TotalFileSize,          // размер файла
 LARGE_INTEGER  TotalBytesTransferred,  // переносимые байты
 LARGE_INTEGER  StreamSize,             // байты в потоке
 LARGE_INTEGER  StreamBytesTransferred, // переносимые потоком байты
 DWORD  dwStreamNumber,                 // текущий поток
 DWORD  dwCallbackReason,               // причина возврата
 HANDLE  hSourceFile,                   // дескриптор источ. файла
 HANDLE  hDestinationFile,              // дескриптор целевого файла
 LPVOID  lpData                         // из CopyFileEx
немпонятно как вызвать собственно мою функцию
из CopyFileEx

и как мне передать
в функцию CopyProgressRoutine
значения все кроме самого первого
потому что размер я могу вычислить методом qfile::size()
« Последнее редактирование: Март 28, 2015, 11:59 от koldun90 » Записан
Bepec
Гость
« Ответ #6 : Март 28, 2015, 12:29 »

Эт называется от дурной головы рукам работы. Ошибку словите при помощи GetLastError. После обычной copyFile.
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #7 : Март 28, 2015, 12:41 »

я разобрался с copyFile
 
Код
C++ (Qt)
LPCSTR q=QString("C:\\am74364.dll").toLocal8Bit().data();
 
 
  LPCSTR a=QString("C:\\a\\am74364.dll").toLocal8Bit().data();
 
 
   BOOL ok=true;
   LPPROGRESS_ROUTINE progre;
  CopyFileA(q,a,ok);

так работает
тока не пойму что нужно сделать в copyfileEx
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #8 : Март 28, 2015, 12:45 »

я просто winapi начал изучать как бы
и вот хотелось бы сделать так копирую я файлик 500 мегабайт
скопировалась какая то часть и мне нужно получить сколько скопировалось допустим 10 мегабайт
вот я хочу использовать copyFileEx только не знаю что делать начиная с 3 параметра

Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #9 : Март 28, 2015, 13:12 »

сделал по аналогии
http://www.jackyfox.com/2010/11/29/progress-kopirovaniya-fayla-copyfileex-i-progressbar/

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
//#include <winbase.h>
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   LPCSTR q=QString("C:\\am74364.dll").toLocal8Bit().data();
 
 
   LPCSTR a=QString("C:\\a\\am74364.dll").toLocal8Bit().data();
   LPPROGRESS_ROUTINE d;
 
   BOOL ok=true;
   LPPROGRESS_ROUTINE progre;
 
 
CopyFileExA(q,a,CopyProgressRoutine,NULL, 0, COPY_FILE_FAIL_IF_EXISTS);
 
 
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
DWORD CALLBACK MainWindow::CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
                                                  LARGE_INTEGER TotalBytesTransferred,
                                                  LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
{
 
 
 
         ui->progressBar->setValue(TotalBytesTransferred.QuadPart/TotalFileSize.QuadPart);
         return PROGRESS_CONTINUE;
}
 
 

ругается на
Код
C++ (Qt)
CopyFileExA(q,a,CopyProgressRoutine,NULL, 0, COPY_FILE_FAIL_IF_EXISTS);

Код:
D:\423423\copy\mainwindow.cpp:23: ошибка: cannot convert 'MainWindow::CopyProgressRoutine' from type 'DWORD (MainWindow::)(LARGE_INTEGER, LARGE_INTEGER, LARGE_INTEGER, LARGE_INTEGER, DWORD, DWORD, HANDLE, HANDLE, LPVOID) {aka long unsigned int (MainWindow::)(_LARGE_INTEGER, _LARGE_INTEGER, _LARGE_INTEGER, _LARGE_INTEGER, long unsigned int, long unsigned int, void*, void*, void*)}' to type 'LPPROGRESS_ROUTINE {aka long unsigned int (__attribute__((__stdcall__)) *)(_LARGE_INTEGER, _LARGE_INTEGER, _LARGE_INTEGER, _LARGE_INTEGER, long unsigned int, long unsigned int, void*, void*, void*)}'
  CopyFileExA(q,a,CopyProgressRoutine,NULL, 0, COPY_FILE_FAIL_IF_EXISTS);

вроде нужно как то вызвать с параметрами но хз как подскажите
                                                                       ^
« Последнее редактирование: Март 28, 2015, 13:15 от koldun90 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #10 : Март 28, 2015, 13:56 »

я так понял мне нужно вызвать call back функцию а как мне это сделать?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #11 : Март 28, 2015, 14:29 »

http://www.codeguru.com/cpp/cpp/cpp_mfc/callbacks/article.php/c10557/Callback-Functions-Tutorial.htm
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #12 : Март 28, 2015, 14:58 »

не очень понятно не могли бы объяснить
как все таки мне седлать коллбек CopyProgressRoutine
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #13 : Март 28, 2015, 16:47 »

Сделал так но почему то ошибка на строке

Код
C++ (Qt)
Test=&CopyProgressRoutine;

mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <windows.h>
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
   DWORD CALLBACK CopyProgressRoutine(
     LARGE_INTEGER TotalFileSize,
     LARGE_INTEGER TotalBytesTransferred,
     LARGE_INTEGER StreamSize,
     LARGE_INTEGER StreamBytesTransferred,
     DWORD dwStreamNumber,
     DWORD dwCallbackReason,
     HANDLE hSourceFile,
     HANDLE hDestinationFile,
     LPVOID lpData
   );
   void soobch();
 
LPPROGRESS_ROUTINE progre;
 
private:
   Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
 
mainwindow.cpp


Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
 
//#include <winbase.h>
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   DWORD CALLBACK(*Test)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID);
   Test=&CopyProgressRoutine;
 
   LPCSTR q=QString("C:\\am74364.dll").toLocal8Bit().data();
 
 
   LPCSTR a=QString("C:\\a\\am74364.dll").toLocal8Bit().data();
 
 
 
   LPVOID data;
 
CopyFileExA(q,a,Test,0,FALSE,COPY_FILE_FAIL_IF_EXISTS);
 
 
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
DWORD CALLBACK MainWindow::CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
                                                  LARGE_INTEGER TotalBytesTransferred,
                                                  LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
{
 
 
         ui->progressBar->setValue(TotalBytesTransferred.QuadPart/TotalFileSize.QuadPart);
         return PROGRESS_CONTINUE;
}
 
void MainWindow::soobch()
{
   QMessageBox msg;
   msg.setText("11111");
   msg.exec();
}
 
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #14 : Март 28, 2015, 17:57 »

вот так вот программа запускается и подает признаки жизни
при клике по кнопке начинается копирование файла файл 10 гигабайт
Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
   LPCSTR q=QString("D:\\0C").toLocal8Bit().data();
 
 
   LPCSTR a=QString("D:\\qw\\0C").toLocal8Bit().data();
LPVOID lpData;
 
CopyFileExA(q,a,(LPPROGRESS_ROUTINE)&MyCopyProgressRoutine,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS);
DWORD p=GetLastError();
 
cout<<p<<endl;
}

 
Код
C++ (Qt)
DWORD p=GetLastError();
 
cout<<p<<endl;
эта штука распечатывает число 80
что может быть?
типо файл уже существует

вот бывает что происходит такая штука
Сигнатура проблемы:
  Имя события проблемы:   APPCRASH
  Имя приложения:   copy.exe
  Версия приложения:   0.0.0.0
  Отметка времени приложения:   033b8118
  Имя модуля с ошибкой:   copy.exe
  Версия модуля с ошибкой:   0.0.0.0
  Отметка времени модуля с ошибкой:   033b8118
  Код исключения:   c0000005
  Смещение исключения:   0000181b
  Версия ОС:   6.1.7601.2.1.0.256.1
  Код языка:   1049
  Дополнительные сведения 1:   0a9e
  Дополнительные сведения 2:   0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:   0a9e
  Дополнительные сведения 4:   0a9e372d3b4ad19135b953a78882e789

такая фигня если удаляю файл из приемника и перезапускаю прогу
« Последнее редактирование: Март 28, 2015, 18:05 от koldun90 » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.363 секунд. Запросов: 23.