Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыл через CreateFile(): INVALID_HANDLE_VALUE, Файл перезаписывается другой программой. 
:(
    Опции темы
malor
  Дата 2.8.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Некоторая программа-1 создала файл, периодически пишет в него данные.
Если мы в другой программе-2 вызовем
Код

    hFileEventMouse = CreateFile(_T(pathEventMouse),  // file to open
                       GENERIC_READ,            // open for reading
                       FILE_SHARE_WRITE,        // share for writing
                       NULL,                    // default security
                       OPEN_EXISTING,            // existing file only
                       FILE_ATTRIBUTE_NORMAL,    // normal file
                       NULL);                    // no attr. template
то сможем читать, что там понаписано.
user posted image

Но если мы запустим программу-2 раньше чем программу-1, то CreateFile() положит в переменную значение INVALID_HANDLE_VALUE, т.к. файл еще не был создан.
user posted image

Затем программа-2 немного поспит (Sleep(10000)), а за это время программа-1 запустится, создаст файлик, начнет свою писанину и прочие дела.
Проснувшись, программа-2 опять сделает вызов CreateFile() с целью получить валидный дескриптор, но он опять равен INVALID_HANDLE_VALUE. 
user posted image
Почему?

Код
#define pathEventMouse            "D:\\VM_remote\\EventMouse.txt"    

HANDLE hFileEventMouse;

bool ReadThatFile()
{
    int result;    
    DWORD dwBytesRead;

    // Парсинг даст нам эти величины 
    int ID_msg = 0;        // Абсолютный номер 
    int _rfbMouseEvent;    
    int keyFlag;
    int coordX; 
    int coordY;

    if (hFileEventMouse == INVALID_HANDLE_VALUE)
    {
        hFileEventMouse = CreateFile(_T(pathEventMouse),    // file to open
                       GENERIC_READ,          // open for reading
                       FILE_SHARE_WRITE,      // share for writing
                       NULL,                  // default security
                       OPEN_EXISTING,         // existing file only
                       FILE_ATTRIBUTE_NORMAL, // normal file
                       NULL);                 // no attr. template

        if (hFileEventMouse == INVALID_HANDLE_VALUE)
            return false;
    }

    int size = GetFileSize(hFileEventMouse, 0);
    char* buf = (char*)malloc(size);
    int dwError; 
    SetFilePointer(hFileEventMouse, 0, NULL, FILE_BEGIN);
    result = ReadFile(hFileEventMouse, buf, size, &dwBytesRead, NULL);
    //dwError = GetLastError(); 
    result = sscanf(buf, "%d %d %d %d %d", &ID_msg, &_rfbMouseEvent, &keyFlag, &coordX, &coordY);
    dwError = GetLastError(); 
    free(buf);
    if (!result) return false;                    // Файл пуст

    //if (!ID_msg) return false;

    // Нужно ориентироваться
    //if ((ID_msg == prevID_msg_Mouse) & (prevID_msg_Mouse > 0))        
    //    return false;

    //prevID_msg_Mouse = ID_msg;    

    return true;
}


int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow)
{
    hFileEventMouse = CreateFile(_T(pathEventMouse),  // file to open
                       GENERIC_READ,            // open for reading
                       FILE_SHARE_WRITE,        // share for writing
                       NULL,                    // default security
                       OPEN_EXISTING,            // existing file only
                       FILE_ATTRIBUTE_NORMAL,    // normal file
                       NULL);                    // no attr. template

    //Sleep(10000);

    ReadThatFile();

    CloseHandle(hFileEventMouse);

    return 0;
}

MSVS 2008

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  ReadFileProject.zip 4,89 Kb
PM MAIL   Вверх
volatile
Дата 3.8.2011, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



malor, возможно дело в том, с какими флагами на шаринг открывает 1-я программа.
Если она не дает прав шаринга, то 2-я программа не сможет его открыть, пока 1-я его не закроет.

нужно чтобы 1-я программа открывала файл с FILE_SHARE_WRITE или хотябы FILE_SHARE_READ
где у вас код 1-ой программы? или это не ваша программа? (если так, тогда дело осложняется, и возможно серьезно осложняется!).

PM MAIL   Вверх
malor
  Дата 3.8.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В программе-1 файл создавался так:
hFileSync := CreateFile('D:\Sync.txt', (GENERIC_READ | GENERIC_WRITE),
          FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);

После прочтения фразы "You cannot request a sharing mode that conflicts with the access mode that is specified in an existing request that has an open handle."  из топика Коды ошибок CreateFile - Расширенные коды ошибок он стал создаваться так:
hFileSync := CreateFile('D:\Sync.txt', GENERIC_WRITE,
          FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);

Вроде помогло...

Это сообщение отредактировал(а) malor - 3.8.2011, 21:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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