| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Проблема GetOpenFileName+CreateFile |
| Автор: geek2600 6.9.2008, 21:13 |
| Здравствуйте уважаемые знатоки WinAPI. Вот сейчас столкнулся с проблемой. Написал программу которая просто при нажатии кнопки создает новый файл и открывает стандартный диалог выбора файла. Компилятор MSVC++ dot.net Операционная система:Windows XP 32-bit. Приведу пример кода: //str 249 #define STRICT #include <windows.h> #include <windowsx.h> #include <stdio.h> #include "w.h" HINSTANCE hI; void OnPaint(HWND); HWND hwndResidue; HWND hwnd; HWND hwndEdit; HWND hwndEdit2; HWND hwndEdit3; int nTime; HFONT hFont; int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){ char szClassName[]="MainWindow"; srand((unsigned int)GetTickCount()); char szTitle[]="RND"; MSG msg; WNDCLASS wc; hI=hInst; memset(&wc,0,sizeof(wc)); wc.lpszClassName=szClassName; wc.hInstance=hInst; wc.lpfnWndProc=WndProc; wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hbrBackground=GetStockBrush(LTGRAY_BRUSH); RegisterClass(&wc); HWND hwnd=CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,10,10,400,150,HWND_DESKTOP,NULL,hInst,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg){ HANDLE_MSG(hwnd,WM_CREATE,OnCreate); HANDLE_MSG(hwnd,WM_COMMAND,OnCommand); HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy); HANDLE_MSG(hwnd,WM_PAINT,OnPaint); } return(DefWindowProc(hwnd,msg,wParam,lParam)); } BOOL OnCreate(HWND hwnd,LPCREATESTRUCT){ CreateWindow("BUTTON","Дробные",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 260,70,80,20,hwnd,(HMENU)ID_GO3,hI,NULL); char szFace[]="Times New Roman Cyr"; LOGFONT lf; ZeroMemory(&lf,sizeof(lf)); strcpy(lf.lfFaceName,szFace); lf.lfHeight=8; hFont=CreateFontIndirect(&lf); return TRUE; } void OnCommand(HWND,int id,HWND,UINT)//А вот функция срабатывающая при нажатии кнопки { if(id==ID_GO3){ OPENFILENAME ofn9; char HTMFilePUT1[1000]; ZeroMemory(&ofn9, sizeof(ofn9)); ofn9.lStructSize = sizeof(OPENFILENAME); ofn9.hwndOwner =hwnd; ofn9.lpstrFile = HTMFilePUT1; ofn9.nMaxFile = sizeof(HTMFilePUT1); ofn9.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; ofn9.nFilterIndex = 1; ofn9.lpstrFileTitle = NULL; ofn9.nMaxFileTitle = 0; ofn9.lpstrInitialDir = NULL; if(GetOpenFileName(&ofn9)){ HANDLE hWipedFile4300; hWipedFile4300 = CreateFile("ne.html", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, 0,NULL); if(hWipedFile4300==INVALID_HANDLE_VALUE){MessageBox(0,"NOTWORK",0,0);} } } } void OnPaint(HWND hwnd) { PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd,&ps); SetBkColor(hdc,RGB(198,195,198)); } void OnDestroy(HWND){ DeleteFont(hFont); PostQuitMessage(0); } После нажатия на кнопку и выбора любого файла я получаю сообщение NOTWORK и файл естественно тоже не создается Пожалуйста подскажите.В чем может быть проблема и как ее можно обойти. Заранее благодарен. |
| Автор: ama_kid 6.9.2008, 21:50 |
| навскидку - у тебя предпоследний параметр у функции CreateFile задан неверно (вместо 0 попробуй FILE_ATTRIBUTE_NORMAL), но проверять лень да и не на чем сейчас. Почитай http://msdn.microsoft.com/en-us/library/aa363874(VS.85).aspx и посмотри http://msdn.microsoft.com/en-us/library/bb540534(VS.85).aspx пример |
| Автор: geek2600 6.9.2008, 21:57 |
| Спосибо. Но к сожалению FILE_ATTRIBUTE_NORMAL никак не повлиял.Если убрать функцию GetOpenFileName то фаил создается без проблем.Тут наверное какойто нюанс с GetOpenFileName есть. |
| Автор: geek2600 6.9.2008, 23:30 |
| А кроме GetLastError() варианты есть? |
| Автор: dumb 7.9.2008, 05:02 |
| объясняю еще раз: когда возникают какие-либо ошибки при вызовах api-функций, нужно вызвать GetLastError и посмотреть какой код она возвращает - как правило этого бывает достаточно, чтобы понять, в чем ошибка. если сам не догоняешь, то пишешь этот код ошибки сюда. "еще варианты"... а ошибку он тебе выдает потому, что такой файл(ne.html) уже существует. если нужно в любом случае создавать новый файл, то и использовать надо флаг CREATE_ALWAYS. |
| Автор: geek2600 7.9.2008, 14:07 |
| if(hWipedFile4300==INVALID_HANDLE_VALUE){ char szLineu[90]; DWORD LK=GetLastError(); sprintf(szLineu,"%d",LK); MessageBox(0,szLineu,0,0); } В моем случае LK=80; немного не понял на сает CREATE_ALWAYS.Это изменение не на что не повлияло. Подскажите , о чем говорит результат GetLastError? |
| Автор: 586 7.9.2008, 16:16 | ||
Не хватало строки 98 - не вызывался GetOpenFileName. |
| Автор: geek2600 7.9.2008, 16:25 |
| вставил ваш код.появляется сообщение Success.но файл не создается.непойму Добавлено через 6 минут и 2 секунды проблема еще заключалась в том что было необходимо указать полный путь-т.е.C:\ne.html. Всем огромное спосибо |