Russian Qt Forum

Программирование => С/C++ => Тема начата: ixtorio от Апрель 05, 2011, 13:01



Название: Диалог открытия файла
Отправлено: ixtorio от Апрель 05, 2011, 13:01
почему данный код не срабатывает как надо?
Код
C++ (Qt)
#include <windows.h>
 
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
OPENFILENAME ofn;       // common dialog box structure
char szFile[260];       // buffer for file name
HWND hwnd;              // owner window
HANDLE hf;              // file handle
 
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
// Display the Open dialog box.
 
if (GetOpenFileName(&ofn)==TRUE)
   hf = CreateFile(ofn.lpstrFile,
                   GENERIC_READ,
                   0,
                   (LPSECURITY_ATTRIBUTES) NULL,
                   OPEN_EXISTING,
                   FILE_ATTRIBUTE_NORMAL,
                   (HANDLE) NULL);
 
   return 0;
}
 
сорец взят с мсдн но мой переписанный тоже не работал ,а на асме это всё работает безупречно


Название: Re: Диалог открытия файла
Отправлено: Denjs от Апрель 05, 2011, 13:08
мсдн ...  фу-фу-фу...

асм? ассемблер?
в Qt есть свои работающие диалоги открытия файла. их используйте.


а по вашему коду - хоть опишиет "как именно оно не работает?!"..ошибки..поведение...


Название: Re: Диалог открытия файла
Отправлено: ixtorio от Апрель 05, 2011, 13:12
вопрос касается не кутэ а с++ и вин апи,поэтому тема в этом разделе...ошибок нет просто программа как запустилась так и выключилась без каких либо ошибок


Название: Re: Диалог открытия файла
Отправлено: Пантер от Апрель 05, 2011, 13:13
Ну так прогони ее через gdb и посмотри где падает.


Название: Re: Диалог открытия файла
Отправлено: Nimbus от Апрель 05, 2011, 13:24
Код
C++ (Qt)
HWND hwnd;              // owner window
ofn.hwndOwner = hwnd;
 
Не проинициализировал же


Название: Re: Диалог открытия файла
Отправлено: ixtorio от Апрель 05, 2011, 17:23
она не падает она просто заканчивает и выходит возвращая 0 функцией GetOpenFileName..и окна у проги нет ,и ресурсов нет ,ничего нет...это весь исходник...задача програмы дать выбрать файл и закрыться после этого


Название: Re: Диалог открытия файла
Отправлено: Пантер от Апрель 05, 2011, 18:13
Вполне возможно, что OPENFILENAME неверно настроил.


Название: Re: Диалог открытия файла
Отправлено: ixtorio от Апрель 05, 2011, 19:03
яже написал что пример этот приведен из мсдн майкрософтовского
если не веришь , сам посмотри http://msdn.microsoft.com/en-us/library/ms646829(v=VS.85).aspx#open_file (http://msdn.microsoft.com/en-us/library/ms646829(v=VS.85).aspx#open_file)

и у меня он неработает,вот этот пример компилится и работает в ассемблере
Код
ASM
  ofn OPENFILENAME <>
  FilterString db "Executable Files (*.exe, *.dll)",0,"*.exe;*.dll",0,"All Files",0,"*.*",0,0
  buffer db 512 dup(?)
 
  mov ofn.lStructSize,SIZEOF ofn
  mov ofn.lpstrFilter, OFFSET FilterString
  mov ofn.lpstrFile, OFFSET buffer
  mov ofn.nMaxFile,512
  mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
  invoke GetOpenFileName, ADDR ofn
 

а переведя его в с++ он тоже не работает,тут не сложно перевести как видишь ....


Название: Re: Диалог открытия файла
Отправлено: Denjs от Апрель 05, 2011, 20:33
блин... вы на Qt-шном форуме спрашиваете... вам действительно не хватает Qt-шного диалога открытия окна?
кстати на "винграде" спрашивали?


Название: Re: Диалог открытия файла
Отправлено: Пантер от Апрель 05, 2011, 20:47
нагуглилось (http://forum.codenet.ru/archive/index.php/t-5093.html)
Может поможет. :)


Название: Re: Диалог открытия файла
Отправлено: ixtorio от Апрель 06, 2011, 00:53
спасибо тебе большое ты дал правильное направление поиска, оказалось что в строке 11 нужно в качестве параметра функции sizeof() указать тип структуры,тоесть OPENFILENAME, и вот теперь всё работает...
вот рабочий исходник...

Код
C++ (Qt)
#include <windows.h>
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
OPENFILENAME ofn;       // common dialog box structure
char szFile[260];       // buffer for file name
HWND hwnd;              // owner window
HANDLE hf;              // file handle
 
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
if (GetOpenFileName(&ofn)==TRUE)
   hf = CreateFile(ofn.lpstrFile,GENERIC_READ,0,(LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
return 0;
}
 


Название: Re: Диалог открытия файла
Отправлено: Пантер от Апрель 06, 2011, 07:34
Винапи такое винапи. :)
ixtorio, я, конечно, занудствую, но решение нагуглилось меньше чем за минуту - мог бы и сам. :)


Название: Re: Диалог открытия файла
Отправлено: ixtorio от Апрель 06, 2011, 19:36
к сожалению не всем везёт =( я тоже гуглил по этому поводу


Название: Re: Диалог открытия файла
Отправлено: Пантер от Апрель 06, 2011, 19:43
шестая ссылка сверху (http://www.google.ru/search?aq=f&sourceid=chrome&ie=UTF-8&q=GetOpenFileName) ;)


Название: Re: Диалог открытия файла
Отправлено: Sahab от Апрель 06, 2011, 22:35
блин... вы на Qt-шном форуме спрашиваете... вам действительно не хватает Qt-шного диалога открытия окна?
кстати на "винграде" спрашивали?
Больше всего раздражает подобное... можно подумать форум только для кутешнигов.