Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/68: Рейтинг темы: голосов - 68, средняя оценка - 4.72
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1

Файловый менеджер

06.04.2011, 23:36. Показов 13803. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Не подскажете, какой компонент используется в тотал командере, для отображения файлов?

>> нашёл ответ на свой впосрос это ListView



Теперь другой вопрос, как отпределять, что каталоги одинаковы?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2011, 23:36
Ответы с готовыми решениями:

Файловый менеджер
Здравствуйте, как написать файловый менеджер с такими командами: 1) Список файлов в каталоге (с возможностью сортировки) 2) Переход в...

Файловый менеджер через winapi
Вобще задали сделать файловый менеджер. Начали учить winapi недавно. Он должен уметь следующее: 1.переместить - перемещает из одной...

Файловый менеджер на чистом С + WinAPI
Уважаемые форумчане) Прошу у Вас помощи в написании программы, которая должна просматривать содержимое и навигация по всем локальным...

21
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
07.04.2011, 04:07
Если вопрос касается только ТС, то необходимо использовать "Синхронизация каталогов".
Применимо же к WinAPI это рекурсивный перебор всех файлов и каталогов и сравнение их характеристик: размер, дата и т.д. Как вариант можно использовать вычисление и сравнение CRC каждого файла - это даст более точный ответ.
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
08.04.2011, 00:47  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
Если вопрос касается только ТС, то необходимо использовать "Синхронизация каталогов".
Применимо же к WinAPI это рекурсивный перебор всех файлов и каталогов и сравнение их характеристик: размер, дата и т.д. Как вариант можно использовать вычисление и сравнение CRC каждого файла - это даст более точный ответ.
благодарю,
в конце следующей неедели выложу пргу с описанием, может кому пригодится...

Добавлено через 15 часов 4 минуты
Ребят, я создаю ListView вот так
C
1
2
3
4
hListView = CreateWindow(WC_LISTVIEW, NULL, 
                                      WS_REPORT|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|LVS_AUTOARRANGE,
                        260+1, 100, 160, 20, hwnd,
                        (HMENU) ID_LISTVIEW, hInstance, NULL);
на что мне Eclipse говорит, что

C
1
2
3
`LVS_AUTOARRANGE' was not declared in this scope    
`WS_REPORT' was not declared in this scope  
`WC_LISTVIEW' was not declared in this scope
я читал, вроде надо библиотеку SysListView32 поключить, как это сделать? не подскажете?

Добавлено через 27 минут
я уже и в C Builder и в Dev C++ попробовал... всё равно не видит...

Добавлено через 1 час 42 минуты
Сижу уже второй час исправляю ошибку..
подключил #include <commctrl.h>, но всё равно прога не видит стиль WS_REPORT
Что делать?

Добавлено через 19 минут
Стиль оказывается назывался LVS_REPORT, но всё равно ListView не отображается...что делать?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <windows.h>
#include <commctrl.h>
 
#define ID_BTN_CREATE 3001
#define ID_LISTVIEW   3002
 
LRESULT CALLBACK WndProc(HWND,UINT,UINT,LONG);
 
 
char szMainClass[]="MainClass";
 
 
HINSTANCE hInstance;
HWND hWndChild = NULL;
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,int nCmdShow)
{
 
MSG Msg;
HWND hWnd;
WNDCLASS WndClass;
WNDCLASS ChildClass;
 
 
WndClass.style=CS_VREDRAW|CS_HREDRAW;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.lpfnWndProc=WndProc;
WndClass.hInstance=hInstance;
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.lpszMenuName=NULL;
WndClass.lpszClassName=szMainClass;
 
 
 
if(!RegisterClass(&WndClass))
return FALSE;
 
 
hWnd=CreateWindow(szMainClass,
"ParentWindow",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
 
while(GetMessage(&Msg,NULL,0,0))
{
DispatchMessage(&Msg);
TranslateMessage(&Msg);
}
return Msg.wParam;
}
 
 
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hBtn_create, hListView;
    switch (msg)
    {
        case WM_CREATE:
        {
 
            hListView =CreateWindow(WC_LISTVIEW, NULL,
                    LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|LVS_AUTOARRANGE,
                        260+1, 100, 160, 20, hwnd,
                        (HMENU) ID_LISTVIEW, hInstance, NULL);
 
            return 0;
        }
 
 
        case WM_DESTROY: {PostQuitMessage(0); return 0;}
    }
 
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
1
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
08.04.2011, 05:51
1) Для начала я не вижу вызова InitCommonControls().
2) Кто-то из программистов MSDN советовал hbrBackground присваивать значение = (HBRUSH)(COLOR_BTNFACE + 1), а не через GetStockbject. Ну да это мелочи...
3) Созданные окна нужно уничтожать при выходе из программы
4) мой пример создания окна (с небольшими поправками на "обстоятельства"):

C++
1
2
3
4
5
6
7
8
9
bool CMainForm::OnCreate(HWND hWnd, LPCREATESTRUCT) {
    // Создаем окно списка
    dwExStyle = WS_EX_CLIENTEDGE|LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT;
    dwStyle = WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SINGLESEL;
    hListView = CreateWindowEx(dwExStyle, WC_LISTVIEW, (LPCTSTR)NULL, dwStyle, 0, 0, 100, 100, hWnd, (HMENU)NULL, g_hInstance, (LPVOID)NULL);
    if(!hListView) return false;
    
    return true;
}
5) прилинкуй библиотеку comctl32.lib к проекту
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
27.04.2011, 12:00  [ТС]
Здравствуйте
У меня вопрос по работе с ListView
Что бы перейти в любую папку кторая отображается там, надо по флагу LBN_DBLCLK переходить?

внизу экзешник и код..
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
//============================================================================
// Name        : kurs_project.cpp
// Author      : max
// Version     :
// Copyright   : fuck off
// Description : Hello World in C++, Ansi-style
//============================================================================
 
#include <windows.h>
#include <commctrl.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <string>
using namespace std;
 
 
#define _WIN32_IE 0x0501
#if (_WIN32_IE >= 0x0500)
#define BTNS_AUTOSIZE   TBSTYLE_AUTOSIZE
#endif
#define TBSTYLE_AUTOSIZE    16
#define BTNS_BUTTON 0
#define CCS_VERT 128
#define TB_SETIMAGELIST    (WM_USER+48)
#define TB_LOADIMAGES    (WM_USER+50)
 
#define ID_BUTTON 2313
 
#define ID_TOOLBAR    100
#define IDM_COPY    1001
#define IDM_MOVE   1002
#define IDM_DEL   1003
#define IDM_CRC   1004
 
#define ID_LISTVIEW_1   3001
#define ID_LISTVIEW_2   3002
 
#define ID_COMBOBOX_1   4001
#define ID_COMBOBOX_2   4002
 
#define ID_LABEL_1      5001
#define ID_LABEL_2      5002
#define ID_LABEL_3      5003
#define ID_LABEL_4      5004
 
LRESULT CALLBACK WndProc(HWND,UINT,UINT,LONG);
char szMainClass[]="MainClass";
HINSTANCE hInstance;
HWND hWndChild = NULL;
HIMAGELIST g_hImageList = NULL;
static HWND hListView_1, hListView_2;
static HWND hComboBox_1, hComboBox_2;
static HWND hLabel_1, hLabel_2, hLabel_3, hLabel_4, hToolBar;
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,int nCmdShow)
{
 
    MSG Msg;
    HWND hWnd;
    WNDCLASS WndClass;
 
    WndClass.style=CS_VREDRAW|CS_HREDRAW;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.lpfnWndProc=WndProc;
    WndClass.hInstance=hInstance;
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground=(HBRUSH)(COLOR_BTNFACE + 1);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.lpszMenuName=NULL;
    WndClass.lpszClassName=szMainClass;
 
    if(!RegisterClass(&WndClass))
        return FALSE;
 
 
    hWnd=CreateWindow(szMainClass,
            "FILE MANAGER", WS_BORDER|WS_SYSMENU|WS_VISIBLE,
            100, 100, 900, 620,
            NULL, NULL, hInstance, NULL);
 
    InitCommonControls();
 
    while(GetMessage(&Msg,NULL,0,0))
    {
        DispatchMessage(&Msg);
        TranslateMessage(&Msg);
    }
    return Msg.wParam;
}
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
HWND CreateSimpleToolbar(HWND hWndParent)
{//создание панели инстурментов
    const int ImageListID = 0;
    const int numButtons = 4;
    const DWORD buttonStyles = BTNS_AUTOSIZE;
    const int bitmapSize = 16;
 
    //создание тулбара
    HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
        WS_CHILD | TBSTYLE_WRAPABLE,
        0, 0, 0, 0,
        hWndParent, NULL, hInstance, NULL);
    if (hWndToolbar == NULL)
    {
        return NULL;
    }
 
    //создание списка картинок, для кнопок
    g_hImageList = ImageList_Create(
        bitmapSize, bitmapSize,
        ILC_COLOR16 | ILC_MASK,
        numButtons, 0);
 
    SendMessage(hWndToolbar, TB_SETIMAGELIST, (WPARAM)ImageListID,
        (LPARAM)g_hImageList);
 
    SendMessage(hWndToolbar, TB_LOADIMAGES, (WPARAM)IDB_STD_SMALL_COLOR,
        (LPARAM)HINST_COMMCTRL);
 
    TBBUTTON tbButtons[numButtons] =
    {
        { MAKELONG(STD_COPY, ImageListID), IDM_COPY, TBSTATE_ENABLED,
                BTNS_AUTOSIZE, {0}, 0, (INT_PTR)"copy" },
        { MAKELONG(STD_PASTE, ImageListID), IDM_MOVE, TBSTATE_ENABLED,
          buttonStyles, {0}, 0, (INT_PTR)"move"},
        { MAKELONG(STD_DELETE, ImageListID), IDM_DEL, TBSTATE_ENABLED,
          buttonStyles, {0}, 0, (INT_PTR)"delete"},
        { MAKELONG(STD_HELP, ImageListID), IDM_CRC, TBSTATE_ENABLED,
                  buttonStyles, {0}, 0, (INT_PTR)"CRC"}
    };
 
    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE,
        (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons,
        (LPARAM)&tbButtons);
 
    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar, TRUE);
    return hWndToolbar;
}
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
void AddColToListView(char *st, int sub, int size)
{
    LVCOLUMN lvc;
    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    lvc.iSubItem = sub;
    lvc.pszText = st;
    lvc.cx = size;
    lvc.fmt = LVCFMT_LEFT;
 
    ListView_InsertColumn(hListView_1, sub, &lvc);
    ListView_InsertColumn(hListView_2, sub, &lvc);
 
}
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
int i;
BOOL InitListViewImageLists(HWND hWndListView,int size)
 {
         HIMAGELIST hSmall;
         SHFILEINFO lp;
         hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR32, size, 1);
 
         WIN32_FIND_DATA FindFileData;
         HANDLE hFind;
 
         hFind = FindFirstFile("C:\\*", &FindFileData);
         if (hFind == INVALID_HANDLE_VALUE){
                 MessageBox(0,"Ошибка", "Не найден",  MB_OK |MB_ICONWARNING);
         }
         else
         {
                 do {//присваеваем атрибуты
                         if(FindFileData.cFileName =="."){//если диск
                                 char buf1 [MAX_PATH]="C:\\*";
                                 strcat(buf1,FindFileData.cFileName);
                                 SHGetFileInfo("",FILE_ATTRIBUTE_DEVICE,&lp,sizeof(lp),SHGFI_ICONLOCATION|SHGFI_ICON|SHGFI_SMALLICON);
 
                                 ImageList_AddIcon(hSmall,lp.hIcon);
                                 DestroyIcon(lp.hIcon);
 
                         }
                         if(FindFileData.cFileName == ".."){//если фаилы,папки
                                 char buf1 [MAX_PATH]="C:\\*";
                                 strcat(buf1,FindFileData.cFileName);
                                 SHGetFileInfo("",FILE_ATTRIBUTE_DIRECTORY,&lp,sizeof(lp),SHGFI_ICONLOCATION|SHGFI_ICON|SHGFI_SMALLICON);
 
                                 ImageList_AddIcon(hSmall,lp.hIcon);
                                 DestroyIcon(lp.hIcon);
                         }
                         //присваеваем иконки
                         char buf1 [MAX_PATH]="C:\\";
                         strcat(buf1,FindFileData.cFileName);
                         DWORD num=GetFileAttributes(buf1);
                         SHGetFileInfo(buf1,num,&lp,sizeof(lp),SHGFI_ICONLOCATION|SHGFI_ICON|SHGFI_SMALLICON);
 
                         ImageList_AddIcon(hSmall,lp.hIcon);
                         DestroyIcon(lp.hIcon);
 
                 } while (FindNextFile(hFind, &FindFileData) != 0);
 
                 FindClose(hFind);
         }
 
         ListView_SetImageList(hWndListView, hSmall, LVSIL_SMALL);
 
         return TRUE;
 }
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
void Viev_List( char *buf,HWND hList,int i){
    LVITEM lvItem;
         lvItem.mask = LVIF_IMAGE|LVIF_TEXT;
         lvItem.state = 0;
         lvItem.stateMask = 0 ;
         lvItem.iItem = i;
         lvItem.iImage=i;
         lvItem.iSubItem = 0;
         lvItem.pszText =buf;
         lvItem.cchTextMax = sizeof(buf);
         ListView_InsertItem(hList, &lvItem);
 }
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
void FindFile(HWND hList)
{
 
                SendMessage(hList, LVM_DELETEALLITEMS, (WPARAM)0,(LPARAM)0);
                i=0;
 
                WIN32_FIND_DATA FindFileData;
                HANDLE hFind;
 
                hFind = FindFirstFile("C:\\*", &FindFileData);
                if (hFind == INVALID_HANDLE_VALUE){
                        MessageBox(0,"Ошибка", "Не найден",  MB_OK |MB_ICONWARNING);
                }
                else
                {
                        do {
                                Viev_List(FindFileData.cFileName,hList,i);//выз. ф-ция Viev_List передаем туда наиденый фаил ,и HWND ListBox и итератор i++,
                                ++i;
 
                        } while (FindNextFile(hFind, &FindFileData) != 0);
 
                        FindClose(hFind); //закрываем работу поиска фаилов
                        InitListViewImageLists(hList,i);//тут уже передаем HWND ListBox, и кол-во фаилов
 
 
                }
}
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    DWORD Drivers;
 
    int i,k;
    char c;
    char buf[]=" ";
    char *ls;
    string s;
    int y=9;
    GetLogicalDrives();
    GetLogicalDriveStrings(128, (LPTSTR)buf);
    switch (msg)
    {
        case WM_CREATE:
        {
            hToolBar = CreateSimpleToolbar(hwnd);
 
            hLabel_1 =CreateWindow("static", "about1",
                          WS_CHILD | WS_VISIBLE | WS_TABSTOP,
                          104, 35+y, 96, 16,
                          hwnd, (HMENU)ID_LABEL_1, hInstance, NULL);
            hLabel_2 =CreateWindow("static", "about2",
                          WS_CHILD | WS_VISIBLE | WS_TABSTOP,
                          554, 35+y, 96, 16,
                          hwnd, (HMENU)ID_LABEL_2, hInstance, NULL);
            hLabel_3 =CreateWindow("static", "way1",
                          WS_CHILD | WS_VISIBLE | WS_TABSTOP,
                          3, 57+y, 96, 16,
                          hwnd, (HMENU)ID_LABEL_3, hInstance, NULL);
            hLabel_4 =CreateWindow("static", "way2",
                          WS_CHILD | WS_VISIBLE | WS_TABSTOP,
                          453, 57+y, 96, 16,
                          hwnd, (HMENU)ID_LABEL_4, hInstance, NULL);
 
            hComboBox_1 =CreateWindow("ComboBox", NULL,
                    WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN|CBS_SORT,
                            3, 33+y, 100, 110, hwnd,
                            (HMENU) ID_COMBOBOX_1, hInstance, NULL);
 
            hComboBox_2 =CreateWindow("ComboBox", NULL,
                    WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWN|CBS_SORT,
                            453, 33+y, 100, 110, hwnd,
                            (HMENU) ID_COMBOBOX_2, hInstance, NULL);
 
            hListView_1 =CreateWindow(WC_LISTVIEW, NULL,
                            LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|LVS_AUTOARRANGE,
                            0, 60+y+15, 450, 500, hwnd,
                            (HMENU) ID_LISTVIEW_1, hInstance, NULL);
            hListView_2 =CreateWindow(WC_LISTVIEW, NULL,
                            LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|LVS_AUTOARRANGE,
                            451, 60+y+15, 450, 500, hwnd,
                            (HMENU) ID_LISTVIEW_2, hInstance, NULL);
 
            ls = buf;
            while (*ls)
            {
                    SendMessage(hComboBox_1, CB_ADDSTRING, 0, (LPARAM)ls);
                    SendMessage(hComboBox_2, CB_ADDSTRING, 0, (LPARAM)ls);
                    ls += strlen(ls)+1;
            }
            SendMessage(hComboBox_1, CB_SETCURSEL, 1, 0);
            SendMessage(hComboBox_2, CB_SETCURSEL, 1, 0);
 
            AddColToListView("Имя", 1, 100);
            AddColToListView("Тип", 2, 50);
            AddColToListView("Размер", 3, 50);
            AddColToListView("Дата", 4, 70);
            AddColToListView("Атрибуты", 5, 50);
            FindFile(hListView_1);
            FindFile(hListView_2);
            return 0;
        }
 
        case WM_DESTROY:
        {
            DestroyWindow(hListView_1);
            DestroyWindow(hListView_2);
            DestroyWindow(hComboBox_1);
            DestroyWindow(hComboBox_2);
            DestroyWindow(hLabel_1);
            DestroyWindow(hLabel_2);
            DestroyWindow(hLabel_3);
            DestroyWindow(hLabel_4);
            DestroyWindow(hToolBar);
            PostQuitMessage(0);
            return 0;
        }
    }
 
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
Миниатюры
Файловый менеджер  
Вложения
Тип файла: rar kurs_project.rar (179.0 Кб, 454 просмотров)
Тип файла: rar code_kurs_project.rar (3.3 Кб, 467 просмотров)
1
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
27.04.2011, 12:34
Каюсь, терпения не хватило читать исходники. Но сразу навскидку:
1) сортируй сначала каталоги, потом уже файлы. Я я этого использовал поле dwData (вроде так называется, точно сейчас не вспомню). Каталоги имели значение = 1, файлы = 0.
2) по поводу LBN_DBLCLK - это самое простое. При обработке этого события снова используем рекурсивную функцию "прохода" по каталогам и получаем содержимое подкаталога
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
27.04.2011, 17:50  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
Каюсь, терпения не хватило читать исходники. Но сразу навскидку:
1) сортируй сначала каталоги, потом уже файлы. Я я этого использовал поле dwData (вроде так называется, точно сейчас не вспомню). Каталоги имели значение = 1, файлы = 0.
2) по поводу LBN_DBLCLK - это самое простое. При обработке этого события снова используем рекурсивную функцию "прохода" по каталогам и получаем содержимое подкаталога
воо спасибо,
0
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
03.05.2011, 23:01  [ТС]
Работа над программой подходит к концу.
Осталось реализовать функцию которая сравнивает каталоги по CRC.
Я откопал в интернете код на дельфи... прошу помощи перенести его на С++

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function GetCheckSum(FileName: string): DWORD;
var
  F: file of DWORD;
  P: Pointer;
  Fsize: DWORD;
  Buffer: array[0..500] of DWORD;
begin
  FileMode := 0;
  AssignFile(F, FileName);
  Reset(F);
  Seek(F, FileSize(F) div 2);
  Fsize := FileSize(F) - 1 - FilePos(F);
  if Fsize > 500 then
    Fsize := 500;
  BlockRead(F, Buffer, Fsize);
  Close(F);
  P := @Buffer;
  asm
     xor eax, eax
     xor ecx, ecx
     mov edi , p
     @again:
       add eax, [edi + 4*ecx]
       inc ecx
       cmp ecx, fsize
     jl @again
     mov @result, eax
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GetCheckSum(′c:Autoexec.bat)));
end;

ps тут используются высокоуровневые функции для работы с файлами, мне надо использовать функции WIN api?


Добавлено через 4 часа 10 минут
Вот к чему привели мои старания

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DWORD GetCheckSum(char filename[MAX_PATH])
{
    HANDLE f;
    DWORD fsize;
    DWORD buf[500];
    void *p;
 
    f = CreateFile(filename, GENERIC_READ,
            FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
            NULL);
 
    long long nFileLen = 0;
    if (f != INVALID_HANDLE_VALUE)
    {
 
       DWORD dwSizeHigh=0, dwSizeLow=0;
       dwSizeLow = GetFileSize(f, &dwSizeHigh);
       nFileLen = (dwSizeHigh * (MAXDWORD+1)) + dwSizeLow;
 
       SetFilePointer(f, nFileLen / 2, NULL, FILE_BEGIN );
       fsize = nFileLen - 1 - SetFilePointer(f,0,0, FILE_CURRENT);
 
       if (fsize > 500) fsize = 500;
       ReadFile(f, buf, fsize, NULL, NULL);
       CloseHandle(f);
       p = &buf;
    }
}
на ReadFile(f, buf, fsize, NULL, NULL); программа вылетает... подскажите в чём проблема? И как мне оставшийся код на асемблере переписать... а то Eclipse не распознаёт регистры...

C
1
`eax' was not declared in this scope
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
04.05.2011, 06:22
А здесь не смотрел?
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
04.05.2011, 07:44  [ТС]
Да у меня же есть код CRC-1, осталось разобраться почему на ReadFile программа вылетает. и как ассемлер переписать...

Добавлено через 15 минут
А, там даже исходники есть. ТОгда мне надо всего лишь разобраться почему программа с ошибкой вылетает на ReadFile.и привинтить вот этот код.

Ему на вход подаётся блок данных char, это то что считаю из файла? или что

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
    unsigned char crc = 0xFF;
    unsigned int i;
 
    while (len--)
    {
        crc ^= *pcBlock++;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
    }
 
    return crc;
}
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
04.05.2011, 07:56
Там есть примеры кода на С++ без использования ассемблера, поэтому и дал эту ссылку, подумал, что так, минимум, ты уберешь эту проблему. Ассемблерные вставки делаются в зависимости от компилятора, каждый из них требует указания своего ключевого слова. В общем случае это __asm{}. Т.е., например, это будет выглядеть следующим образом:
C++
1
2
3
4
5
__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}
Насчет ReadFile() - получи код ошибки, тогда будет ясно что не так. По приведенному тобой коду не ясно "откуда ноги растут".
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
04.05.2011, 08:43  [ТС]
С ReadFile разобрался.

Assembler
1
2
3
4
5
__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}
если вот этот код вставлять в процедуру, как вернуть значение? командой RETN ?


и вот тут вопрос. тут мне надо на вход буфер подать и его длинну, так я понимаю?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
    unsigned char crc = 0xFF;
    unsigned int i;
 
    while (len--)
    {
        crc ^= *pcBlock++;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
    }
 
    return crc;
}
Добавлено через 32 минуты
GrayWolf, большое спасибо.

в итоге, подправив типы переменных, у меня получился следующие две процедуры.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
DWORD Crc8(DWORD *pcBlock, unsigned int len)
{
    DWORD crc = 0xFF;
    unsigned int i;
 
    while (len--)
    {
        crc ^= *pcBlock++;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
    }
 
    return crc;
}
//---------------------------------------------------------------------------------------------------------
DWORD GetCheckSum(char filename[MAX_PATH])
{
    HANDLE f;
    DWORD fsize, freal, res_crc;
    DWORD buf[500];
    void *p;
 
    f = CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
            /*FILE_SHARE_READ*/0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
            0);
 
    long long nFileLen = 0;
    if (f != INVALID_HANDLE_VALUE)
    {
 
       DWORD dwSizeHigh=0, dwSizeLow=0;
       dwSizeLow = GetFileSize(f, &dwSizeHigh);
       nFileLen = (dwSizeHigh * (MAXDWORD+1)) + dwSizeLow;
 
       SetFilePointer(f, nFileLen / 2, NULL, FILE_BEGIN );
       fsize = nFileLen - 1 - SetFilePointer(f,0,0, FILE_CURRENT);
 
       if (fsize > 500) fsize = 500;
       ReadFile(f, buf, fsize, &freal, NULL);
       CloseHandle(f);
       p = &buf;
       res_crc = Crc8(buf, fsize);
       return res_crc;
    }
}
1
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
04.05.2011, 09:03
Насчет ассемблерных вставок. В asm-коде возможно использовать переменные, объявленные за пределами видимости блока, т.е. что-то вроде:

C++
1
2
3
4
5
BYTE buff;
 
__asm {
mov buff, 1
}
Что, естесственно, делает возможным вернуть любой нужный нам результат. Функция RETN произведет выход из текущей процедуры и вернет указанный код, но, имхо, это удобно только в том случае, если все тело процедуры представляет собой ассемблерный код
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
04.05.2011, 09:08  [ТС]
Я почитал тут, что бы в MinGV распознался асемблерные вставки, необходимо использовать синтаксис AT&T, а это пока для меня слишком... как нибудь будет свободное время - разберусь.
1
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
04.05.2011, 09:14
В MinGW можно использовать и синтаксис Intel. Для этого необходимо указать ключ -masm=intel для компилятора (gcc). Не приходилось пока что пробовать, честно говорю. На изучение синтаксиса AT&T у меня ушло очень мало времени - разница не сильно большая. Просто Intel привычней уже
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.05.2011, 09:18
Здесь вообще не нужна ассемблерная вставка. Это всё можно нормально на Си написать.
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
04.05.2011, 09:21  [ТС]
Я уже написал) но хотелось асемблер использовать) ну ладно.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.05.2011, 09:36
Я intel'овский ассемблер плохо знаю, а разные виды синтаксиса - и подавно. Не очень понятно, откуда такое стремление написать именно на ассемблере, но выглядеть будет что-то типа того. Если тут что-то не так с точки зрения синтаксиса именно ассемблера (а не вставки), то надо просто инструкции переписать как надо

C
1
2
3
4
5
6
7
8
9
10
11
12
asm ("xor eax, eax\n"
     "xor ecx, ecx\n"
     "mov edi , %1\n" /* %1 = p */
     "1:\n"
     "add eax, [edi + 4*ecx]\n"
     "inc ecx\n"
     "cmp ecx, %2\n"  /* %2 = fsize */
     "jl 1b\n"
     "mov %0, eax"    /* %0 = result */
     : "=r" (result)
     : "r" (p), "r" (fsize)
     : "eax", "ecx", "edi", "memory");
Добавлено через 32 секунды
Да, я исхожу из того, что Eclipse использует gcc
1
курлык-курлык
 Аватар для Max Patsy
87 / 96 / 8
Регистрация: 26.11.2009
Сообщений: 396
Записей в блоге: 1
09.05.2011, 22:17  [ТС]
Выкладываю исходники файлового менеджера.
Надеюсь они кому-нибудь пригодятся. Тут есть конечно над чем поработать, но ведь идеальных программ не бывает

Огромное спасибо выражаю GrayWolf, который своими постами помогал мне и приближал меня к завершению работы!
Вложения
Тип файла: rar code.rar (5.1 Кб, 445 просмотров)
4
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
09.05.2011, 23:25
Максим Ширинкин, чегой-то по причине глубокой ночи не сразу понял, зачем ты разделял опознание папок "." и ".." (пробежал просто глазами, честно), только потом уже дошло
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2011, 23:25
Помогаю со студенческими работами здесь

Необходимо разработать простейший файловый менеджер
Суть задачи в том, что информацию о файлах необходимо получать через таблицу FAT. Возникли трудности с тем, что не могу понять как хранить...

Файловый менеджер. Отображение процесса копирования файла
Мне по курсовой работе нужно сделать файловый менеджер средствами WinApi. Тут мне повезло наткнутся на тему...

Менеджер паролей
Доброго всем дня. Выдали мне задание написать менеджер паролей для интернета не зависящий от браузера. Может подскажите с чего начать...

Файловый поток и std::string
добрый день сейчас меня немножко ввело в тупняк - из файлового потока(ifstream) нельзя прочитать по словам типа std::string? только char*...

Файловый ввод/вывод данных. решение? ;-)
Народ выручайте! Мне нужно решить 4 задачи по С++, я этот язык нифига не понимаю, проболел в начале когда нам его объясняли, а дальше сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru