Ничего не понимаю или ACCESS_DENIED

Vladislav177Rus

При запуске этой программы создается файл с указанным содержимым, он открывается, его размер правильно определяется, но ReadFile возвращает 0, а GetLastError 5, т.е. отказано в доступе. Закрывается файл тоже нормально. В чем может быть дело?
 #pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:main")

#include <windows.h>

void create_def_options_file{
unsigned long lBytes;
void *hFileOpt = CreateFile("options.txt", 0x40000000, 3, NULL, 4, 0, 0);
char def_file[200] = "Всякий стуфф";
WriteFile(hFileOpt, def_file, strlen(def_file &lBytes, NULL);
CloseHandle(hFileOpt);
}

void main{
unsigned long lBytes;
char buffer[10240];
if(GetFileAttributes("options.txt") == -1){
create_def_options_file;
}
void *hFileOpt = CreateFile("options.txt", 0x40000000, 3, NULL, 4, 0, 0);
unsigned long lSize = GetFileSize(hFileOpt, 0);
ReadFile(hFileOpt, buffer, 10240, &lBytes, 0);
long t = GetLastError;
CloseHandle(hFileOpt);
ExitProcess(0);
}

Dasar

флаги у CreateFile правильно указаны?
ps
Я всегда буду использовать именнованные константы вместо магических чисел.
Я всегда буду использовать именнованные константы вместо магических чисел.
Я всегда буду использовать именнованные константы вместо магических чисел.

Vladislav177Rus

Я бы с радостью всегда использовал именованные константы, но VC не выдает мне FILE_SHARE_READ, OPEN_ALWAYS, GENERIC_READ etc в списке. Надо что-то подключить? Access Denied выдается по прежнему. Может быть, он не успевает закрыть файл? (бред... а вдруг не бред?)

zontik

1. Он ругается если ты их пишешь?
2. 0x40000000 - это GENERIC_WRITE, GENERIC_READ равен 0x80000000

zontik

Вообще твоя фраза непонятна, VC ничего не может выдавать, выдает какой-нибудь IntelliSense, и то не обязан и иногда глючит. Итого есть вопрос:
- в каком IDE ты пишешь?

Vladislav177Rus

Большое спасибо, теперь работает, я как-то не подумал, что доступ на запись еще не означает доступ на чтение.
На константы не ругается, но почему он тогда не выдает их в Intellisense и как его заставить это делать?
Visual C++ 6.0

zontik

Ждем DarkGrey'я потому как я сколько не писал в VS6.0 никогда не видел что бы VS6.0 автодоплонения делал.
ЗЫ: Я говорю про встроенный в VS.NET

margadon

Скомпили Browse Information в проекте. Самое простое - по правому клику по такой именованной константе выбери Go to declaration of 'blablabla' - компилятор возмутится и спросит нужно ли тебе бровс информейшн делать. Если и после этого не находит - добавь заголовочные файлы винды, да побольше.

Dasar

VC6.0 автодополнения делает, но периодически в нем чего-нибудь замыкает и он глючит.
ps
Для более корректной работы Intellsence-а рекомендую поставить VisualAssist.

Dasar

> Большое спасибо, теперь работает, я как-то не подумал, что доступ на запись еще не означает доступ на чтение
При наличии имен вместо чисел - данная опечатка сразу бы бросилась в глаза, а с магическими числами приходится только пожимать плечами...

rosali

Скомпили Browse Information в проекте...
Это может помочь узнать, что значение GENERIC_READ такое-то, что нафиг не нужно. Нужно, чтобы он мог подсказать, какие константы имеет смысл ставить в качестве такого-то параметра, он это не умеет.

bleyman

Это может помочь узнать, что значение GENERIC_READ такое-то, что нафиг не нужно. Нужно, чтобы он мог подсказать, какие константы имеет смысл ставить в качестве такого-то параметра, он это не умеет.
ЛОЛ.

Marinavo_0507

А почему LOL?
Вот у меня в мане на функцию open перечислены константы, задающие флаги.
По-моему, удобно, когда этот список легко доступен.

bleyman

У меня в мсдне тоже перечислены константы, задающие флаги.
Но предполагать, что интеллисенс будет по контрлпробелу выкидывать их список как-то эээ... загадочно =)

Marinavo_0507

Лично я, в результате незнакомства со средствами от MS, и предполагал что-то в этом роде
А что ему может помешать?

bleyman

То что а) параметр у функции - дворд, б) M$ не сделала для плюсов нормальной надстройки с комментариями по параметрам, которая ныкалась бы в комментариях перед функциями (ну то есть что-то там есть, но убогое в) поэтому в виндовс.аш нигде не указано, какие из дефайнутых констант могут быть использованы в качестве конкретного дворда.
В шарпе такое возможно по единственной причине - там вообще все флаги сделаны не в виде
#define ZZZ_FLAG1 1024
а в виде
enum ZzzFlag
{
flag1 = 1024,
}
и параметры у функций соответсвующие. Автоподсказка при этом появлятся когда ты уже напишешь в качестве параметра "ZzzFlag.". Вот.
А ЛОЛ - потому что телепатию еще не изобрели =)

Marinavo_0507

А не нужна телепатия.
Всего лишь нужно знать, где искать описания библиотечных функций.
Мне казалось, это уже лет 5, а то и 10, делают. Я видел Delphi 3 (мой последний опыт программирования под MS там уже было такое...

Dasar

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

Marinavo_0507

Нет описаний? А как же вы программируете?

Dasar

по документации
ps
документация и мета-описания - это совершенно независимые вещи.

bleyman

В машинночитаемом виде

Marinavo_0507

Понятно.
Странно, что за 15 лет или сколько там лет функции CreateFile не написали эти описания, за деньги же работают.
Значит, я переоценивал возможности IDE, издали чужой пирог кажется вкуснее

bleyman

Нет, в конце концов написали конечно же. Только в шарпе =)

Dasar

> Значит, я переоценивал возможности IDE, издали чужой пирог кажется вкуснее
Если функция грамотно описана, то IDE нормально подсказывает.
грамотно описанная функция - это:

OpenFile(
const char * path,
FileMode mode,
FileAccess access,
FileShare share,
int bufferSize
);

неграмотно описанная:

OpenFile(
void * path,
DWORD mode,
DWORD access,
DWORD share,
DWORD bufferSize
);

Marinavo_0507

Библиотечная функция неграмотно описана?
Ничего не понимаю.

Dasar

> Библиотечная функция неграмотно описана?
так библиотечным функциям лет по 15-20 уже будет.

Marinavo_0507

Ну да.
И до сих пор IDE не знает, какие у них должны быть параметры.
А зачем тогда такое IDE нужно?

Dasar

vc 6 - которая обсуждается в данном треде - была выпущена примерно 8 лет назад.

Marinavo_0507

ооо
так бы и сказали сразу

bleyman

И до сих пор IDE не знает, какие у них должны быть параметры.
А зачем тогда такое IDE нужно?
ээээ. Выделять некоторые библиотеки изо всех остальных и хардкодить в ИДЕ поЦказки при их использовании - очень плохо. Не только как источник забавных ошибок, но и поскольку лоббирует библиотеки аффтара ИДЕ.
Переписывать виндовс.аш так, как говорит ДаркГрей, чуваков из М$ почему-то заломало. Возможно, их просто заломало. Возможно, им не захотелось парится с синхронизацией двух версий всего этого говна - с дефайнами же тоже надо из соображений backward compatibility оставить. Возможно, возникают какие-нить проблемы при использовании чистого С (хотя вряд ли).
А причем тут шестая студия? Седьмая точно так же себя ведет (а что она может поделать?). А возможность делать комменты к функциям типа вот так:
/////////////////////
// mega-comment
void f;
так чтобы всплывала поцказка со словами "мега-коммент" уже очень давно была. Не помню как давно.
Оставить комментарий
Имя или ник:
Комментарий: