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

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

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

Сообщений: 606



Просмотр профиля
« Ответ #15 : Март 29, 2015, 06:21 »

не очень понятно не могли бы объяснить
как все таки мне седлать коллбек CopyProgressRoutine
Cделай как в примере, что ты указывал. Т.е. калбэк должен быть отдельной функцией, а не методом класса ( в крайнем случае статическим методом).
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


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

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

mainwindow.cpp

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <iostream>
#include <cstring>
//#include <winbase.h>
 
using namespace std;
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ui->progressBar->setMaximum(100);
//   DWORD CALLBACK(*Test)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID);
 //  Test=&MyCopyProgressRoutine;
 
 
 
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
DWORD CALLBACK MyCopyProgressRoutine( LARGE_INTEGER TotalFileSize,  // размер файла в байтах
                                                  LARGE_INTEGER TotalBytesTransferred,  //байтов скопировано
                                                   LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
 
{
//    switch(dwCallbackReason)
//    {
//        case CALLBACK_CHUNK_FINISHED:
//ui->progressBar->setValue((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);
   //string w=QString("скопировано ").toStdString().data()
    MainWindow *s;
    s->pb(StreamSize,TotalFileSize);
 
           return PROGRESS_CONTINUE;   //StreamSize.
 
 
//    }
 
}
 
 
 
 
 
void MainWindow::on_pushButton_clicked()
{
   LPCSTR q=QString("D:\\NBA 2K15\\1I").toLocal8Bit().data();
//    LARGE_INTEGER s(1);
//            LARGE_INTEGER q(2);
//    pb(1,2);
 
   LPCSTR a=QString("D:\\qw\\123").toLocal8Bit().data();
LPVOID lpData;
QApplication::processEvents();
CopyFileExA(q,a,(LPPROGRESS_ROUTINE)&MyCopyProgressRoutine,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS);
// DWORD p=GetLastError();
 
// cout<<p<<endl;
}
void MainWindow::pb(LARGE_INTEGER StreamSize, LARGE_INTEGER TotalFileSize)
{
   ui->progressBar->setValue((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);
}
 
сделал так все равно результат один и тот же
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



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

Я, конечно извиняюсь. Но что это за код :
Код
C++ (Qt)
MainWindow *s;
    s->pb(StreamSize,TotalFileSize);
Как , по твоему, это должно работать ?!  Шокированный
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #18 : Март 29, 2015, 07:38 »

мне нужно как то вызвать изменения прогресс бара

если я вызываю
Код
C++ (Qt)
ui->progressBar->setValue((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);

вот так
Код
C++ (Qt)
static DWORD CALLBACK MyCopyProgressRoutine( 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((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);
   cout<<(StreamSize.QuadPart*100)/TotalFileSize.QuadPart<<endl;
           return PROGRESS_CONTINUE;   //StreamSize.
}

то пишет
D:\423423\copy\mainwindow.cpp:50: ошибка: 'ui' was not declared in this scope
     ui->progressBar->setValue((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);
 ^
так откуда мне вызвать все таки вызвать
Код
C++ (Qt)
ui->progressBar->setValue
впрочем это не важно программа все равно крашится даже если просто сделать
Код
C++ (Qt)
static DWORD CALLBACK MyCopyProgressRoutine( 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;  
}
« Последнее редактирование: Март 29, 2015, 07:39 от koldun90 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #19 : Март 29, 2015, 07:40 »

Я, конечно извиняюсь. Но что это за код :
Код
C++ (Qt)
MainWindow *s;
    s->pb(StreamSize,TotalFileSize);
Как , по твоему, это должно работать ?!  Шокированный
ну я вызываю метод класса который изменяет прогресс бар
Код
C++ (Qt)
void MainWindow::pb(LARGE_INTEGER StreamSize, LARGE_INTEGER TotalFileSize)
{
   ui->progressBar->setValue((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);
}
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #20 : Март 29, 2015, 08:35 »

давай попробуй модифицировать код так:
Код
C++ (Qt)
#include <QDebug>
.....
void MainWindow::on_pushButton_clicked()
{
   static char q[] = "D:\\NBA 2K15\\1" ; //правильное имя файла
   static char a[] = "D:\\qw\\123"; //куда копировать
 
   CopyFileExA(q,a,(LPPROGRESS_ROUTINE)&MyCopyProgressRoutine,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS);
 
}
.....
DWORD CALLBACK MyCopyProgressRoutine( LARGE_INTEGER TotalFileSize,  // размер файла в байтах
                                                  LARGE_INTEGER TotalBytesTransferred,  //байтов скопировано
                                                   LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
 
{
   qDebug() << "progress:" << TotalBytesTransferred ;
   return PROGRESS_CONTINUE;   //StreamSize.
}
 

В *.pro файле добавть строку:
Код:
CONFIG+=console
« Последнее редактирование: Март 29, 2015, 08:39 от alex312 » Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #21 : Март 29, 2015, 09:07 »

делаю так
Код
C++ (Qt)
DWORD CALLBACK MyCopyProgressRoutine( LARGE_INTEGER TotalFileSize,  // размер файла в байтах
                                                  LARGE_INTEGER TotalBytesTransferred,  //байтов скопировано
                                                   LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
 
{
 
           qDebug() << "progress:" << TotalBytesTransferred.QuadPart ;
           return PROGRESS_CONTINUE;   //StreamSize.
}
 
void MainWindow::on_pushButton_clicked()
{
 
   static char q[] = "D:\\game.dat" ; //правильное имя файла
       static char a[] = "D:\\qw\\123"; //куда копировать
 
 
   CopyFileExA(q,a,(LPPROGRESS_ROUTINE)&MyCopyProgressRoutine,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS);
}
 
ошибки нет пока
но куда прикрутить прогресс бар откуда вызвать ?
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #22 : Март 29, 2015, 09:19 »

если прогресс бар добавить так
Код
C++ (Qt)
DWORD CALLBACK MyCopyProgressRoutine( LARGE_INTEGER TotalFileSize,  // размер файла в байтах
                                                  LARGE_INTEGER TotalBytesTransferred,  //байтов скопировано
                                                   LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
 
{
       MainWindow s;
       s.pb(TotalBytesTransferred,TotalFileSize);
           qDebug() << "progress:" << TotalBytesTransferred.QuadPart ;
           return PROGRESS_CONTINUE;   //StreamSize.
}
 
void MainWindow::pb(LARGE_INTEGER  TotalBytesTransferred, LARGE_INTEGER TotalFileSize)
{
   QApplication::processEvents();
   ui->progressBar->setValue((TotalBytesTransferred.QuadPart*100)/TotalFileSize.QuadPart);
}
 
 
прогресс бар не меняется
файл копируется все норм но мне нужно чтоб прогресс бар изменялся
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #23 : Март 29, 2015, 09:49 »

я вижу так:
Код
C++ (Qt)
//*.hpp
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
   static MainWindow* instance_;
public:
   static MainWindow* instance() {return instance_;}
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
.....
};
...........
 
// *.cpp
 
 
MainWindow* MainWindow::instance_ = 0;
 
.....
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   instance_ = this;
   ui->setupUi(this);
   .......
}
 
void MainWindow::pb(LARGE_INTEGER StreamSize, LARGE_INTEGER TotalFileSize)
{
   ui->progressBar->setValue((StreamSize.QuadPart*100)/TotalFileSize.QuadPart);
   qApp->processEvents();
}
 
DWORD CALLBACK MyCopyProgressRoutine( LARGE_INTEGER TotalFileSize,  // размер файла в байтах
                                                  LARGE_INTEGER TotalBytesTransferred,  //байтов скопировано
                                                   LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
 
{
   qDebug() << "progress:" << TotalBytesTransferred ;
   MainWindow::instance()->pb(TotalBytesTransferred, TotalFileSize)
   return PROGRESS_CONTINUE;   //StreamSize.
}
 
 
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


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

Ошибки
mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <windows.h>
#include <QMainWindow>
 
static DWORD CALLBACK MyCopyProgressRoutine(
        LARGE_INTEGER TotalFileSize,
       LARGE_INTEGER TotalBytesTransferred,
       LARGE_INTEGER StreamSize,
       LARGE_INTEGER StreamBytesTransferred,
       DWORD dwStreamNumber,
       DWORD dwCallbackReason,
       HANDLE hSourceFile,
       HANDLE hDestinationFile,
       LPVOID lpData
     );
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
   static MainWindow* instance_;
public:
   static  MainWindow* instance()
   {
       return instance_;
   }
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
 
 
LPPROGRESS_ROUTINE progre;
 
private slots:
void on_pushButton_clicked();
public slots:
void pb(LARGE_INTEGER,LARGE_INTEGER);
 
private:
   Ui::MainWindow *ui;
 
};
 
#endif // MAINWINDOW_H
 

mainwindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <iostream>
#include <cstring>
#include <QDebug>
#include <commctrl.h>
//#include <winbase.h>
 
using namespace std;
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   instance_ = this;
       ui->setupUi(this);
   ui->progressBar->setMaximum(100);
   ui->progressBar->setValue(3);
 
}
 
 
MainWindow::~MainWindow()
{
   delete ui;
}
void MainWindow::on_pushButton_clicked()
{
 
 
   char q[] = "D:\\Error.log" ; //правильное имя файла
   char a[] = "D:\\qw\\123"; //куда копировать
 
 
   CopyFileExA(q,a,(LPPROGRESS_ROUTINE)&MyCopyProgressRoutine,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS);
}
void MainWindow::pb(LARGE_INTEGER  TotalBytesTransferred, LARGE_INTEGER TotalFileSize)
{
   QApplication::processEvents();
  // ui->progressBar->setValue((TotalBytesTransferred.QuadPart*100)/TotalFileSize.QuadPart);
   ui->progressBar->setValue(7);
}
 
DWORD CALLBACK MyCopyProgressRoutine( LARGE_INTEGER TotalFileSize,  // размер файла в байтах
                                                  LARGE_INTEGER TotalBytesTransferred,  //байтов скопировано
                                                   LARGE_INTEGER StreamSize,
                                                  LARGE_INTEGER StreamBytesTransferred,
                                                  DWORD dwStreamNumber,
                                                  DWORD dwCallbackReason,
                                                  HANDLE hSourceFile,
                                                  HANDLE hDestinationFile,
                                                  LPVOID lpData)
 
 
{
 
       MainWindow::instance()->pb(TotalBytesTransferred, TotalFileSize);
           qDebug() << "progress:" << TotalBytesTransferred.QuadPart ;
           return PROGRESS_CONTINUE;   //StreamSize.
}
ругается на
Код
C++ (Qt)
instance_ = this;
  -- на эту строчку  D:\423423\copy\mainwindow.h:32: ошибка: undefined reference to `MainWindow::instance_'
и на
Код
C++ (Qt)
public:
   static  MainWindow* instance()
   {
       return instance_;   -- на эту строчкуD:\423423\copy\mainwindow.cpp:16: ошибка: undefined reference to `MainWindow::instance_'
   }
« Последнее редактирование: Март 29, 2015, 11:12 от koldun90 » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



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

Ошибки
потому как, надо в *.срр добавить строку
Код
C++ (Qt)
MainWindow* MainWindow::instance_ = 0;
прочитать про статические переменные класса, и внимательно посмотреть на мое предидущее сообщение.
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


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

Ошибки
потому как, надо в *.срр добавить строку
Код
C++ (Qt)
MainWindow* MainWindow::instance_ = 0;
прочитать про статические переменные класса, и внимательно посмотреть на мое предидущее сообщение.

так
Код
C++ (Qt)
MainWindow* MainWindow::instance_ = 0;
   instance_ = this;
       ui->setupUi(this);
 
?

а нет добавил вроде бы так все скопмилировалось
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <iostream>
#include <cstring>
#include <QDebug>
#include <commctrl.h>
//#include <winbase.h>
 
using namespace std;
 
MainWindow* MainWindow::instance_ = 0;
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
  // MainWindow* MainWindow::instance_ = 0;
   instance_ = this;
       ui->setupUi(this);
   ui->progressBar->setMaximum(100);
   ui->progressBar->setValue(0);
}
 
« Последнее редактирование: Март 29, 2015, 11:24 от koldun90 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

...на эту строчку  D:\423423\copy\mainwindow.h:32: ошибка: undefined reference to `MainWindow::instance_'
Еще один пытается использовать форум как "живой хелп", типа "чего там думать? Копи-паста, дорисовал фразу вопроса, запостил - быстрее дело будет". Это было много раз и никогда ничем хорошим не кончалось. Это не справочник а люди, их доверием лучше не злоупотреблять.
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


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

...на эту строчку  D:\423423\copy\mainwindow.h:32: ошибка: undefined reference to `MainWindow::instance_'
Еще один пытается использовать форум как "живой хелп", типа "чего там думать? Копи-паста, дорисовал фразу вопроса, запостил - быстрее дело будет". Это было много раз и никогда ничем хорошим не кончалось. Это не справочник а люди, их доверием лучше не злоупотреблять.
я поэтому и спрашиваю потому что не знаю
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


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

Ошибки
потому как, надо в *.срр добавить строку
Код
C++ (Qt)
MainWindow* MainWindow::instance_ = 0;
прочитать про статические переменные класса, и внимательно посмотреть на мое предидущее сообщение.


вообщем огромное спасибо тебе

а где прочитать про статистические переменные доступно....
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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