Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема GetOpenFileName+CreateFile, Проблема GetOpenFileName+CreateFile 
:(
    Опции темы
geek2600
Дата 6.9.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 19.11.2006

Репутация: 1
Всего: 1



Здравствуйте уважаемые знатоки 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 и файл естественно тоже не создается
Пожалуйста подскажите.В чем может быть проблема и как ее можно обойти.
Заранее благодарен.
PM MAIL   Вверх
ama_kid
Дата 6.9.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



навскидку - у тебя предпоследний параметр у функции CreateFile задан неверно (вместо 0 попробуй FILE_ATTRIBUTE_NORMAL), но проверять лень да и не на чем сейчас. Почитай тут и посмотри этот пример


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
geek2600
Дата 6.9.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 19.11.2006

Репутация: 1
Всего: 1



Спосибо.
Но к сожалению FILE_ATTRIBUTE_NORMAL никак не повлиял.Если убрать функцию GetOpenFileName то фаил создается без проблем.Тут наверное какойто нюанс с GetOpenFileName есть.
PM MAIL   Вверх
586
Дата 6.9.2008, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(geek2600 @  6.9.2008,  22:13 Найти цитируемый пост)
 if(hWipedFile4300==INVALID_HANDLE_VALUE){MessageBox(0,"NOTWORK",0,0);}

В таких ситуациях надо выводить сообщение с кодом ошибки GetLastError(), и сразу все вопросы отпадут.
PM   Вверх
geek2600
Дата 6.9.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 19.11.2006

Репутация: 1
Всего: 1



А кроме GetLastError() варианты есть?
PM MAIL   Вверх
dumb
Дата 7.9.2008, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(geek2600 @  7.9.2008,  00:30 Найти цитируемый пост)
А кроме GetLastError() варианты есть?
объясняю еще раз: когда возникают какие-либо ошибки при вызовах api-функций, нужно вызвать GetLastError и посмотреть какой код она возвращает - как правило этого бывает достаточно, чтобы понять, в чем ошибка. если сам не догоняешь, то пишешь этот код ошибки сюда. "еще варианты"... smile

а ошибку он тебе выдает потому, что такой файл(ne.html) уже существует. если нужно в любом случае создавать новый файл, то и использовать надо флаг CREATE_ALWAYS.
PM MAIL   Вверх
geek2600
Дата 7.9.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 19.11.2006

Репутация: 1
Всего: 1



   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?


Это сообщение отредактировал(а) geek2600 - 7.9.2008, 16:10
PM MAIL   Вверх
586
Дата 7.9.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
HINSTANCE hI;
void OnPaint(HWND);
HWND hwndResidue;
HWND hwnd;
HWND hwndEdit;
HWND hwndEdit2;
HWND hwndEdit3;
int nTime;
HFONT hFont;

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
BOOL OnCreate(HWND hwnd,LPCREATESTRUCT);
void OnCommand(HWND,int id,HWND,UINT);
//void OnPaint(HWND hwnd);
void OnDestroy(HWND);

#define ID_GO3    100


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;
}

int ErrorMessageBox(HWND hWnd, LPCTSTR lpFunctionName, LPCTSTR lpTitle, UINT uType)
{
    TCHAR buf[1024];
    LPTSTR pDscr = 0;
    DWORD dwErr = GetLastError();
    FormatMessage(0x1100, 0, dwErr, 0, (char*)&pDscr, 0, 0);
    _sntprintf(buf, sizeof(buf)/sizeof(TCHAR), _T("%s failed with error %d: %s"), lpFunctionName, dwErr, pDscr);
    buf[sizeof(buf)/sizeof(TCHAR)-1] = 0;        // need for snprintf
    LocalFree((HLOCAL)pDscr);
    return MessageBox(hWnd, buf, lpTitle, uType);
}


void OnCommand(HWND,int id,HWND,UINT)//А вот функция срабатывающая при нажатии кнопки
{


    if(id==ID_GO3){
        OPENFILENAME ofn9;
        char HTMFilePUT1[1000];
        HTMFilePUT1[0] = 0;                    // 1
        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*/ CREATE_ALWAYS,
                            0,NULL);
            if(hWipedFile4300==INVALID_HANDLE_VALUE)
            {
                ErrorMessageBox(hwnd, _T("CreateFile"), 0, 16);
            } else {
                MessageBox(hwnd, "Success", "", 0);
                CloseHandle(hWipedFile4300);
            }
        }
            
    }
    
}
void OnPaint(HWND hwnd)
{
        /*PAINTSTRUCT ps;
        HDC hdc=BeginPaint(hwnd,&ps);
        SetBkColor(hdc,RGB(198,195,198));*/

}
void OnDestroy(HWND){
    DeleteFont(hFont);
    PostQuitMessage(0);
}

Не хватало строки 98 - не вызывался GetOpenFileName.
PM   Вверх
geek2600
Дата 7.9.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 19.11.2006

Репутация: 1
Всего: 1



вставил ваш код.появляется сообщение Success.но файл не создается.непойму smile

Добавлено через 6 минут и 2 секунды
проблема еще заключалась в том что было необходимо указать полный путь-т.е.C:\ne.html.
Всем огромное спосибо
 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0949 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.