![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
mad_lollipop |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 5.9.2007 Репутация: нет Всего: нет |
Привет всем.
Возникла проблема: Есть многопоточное приложение(Multithreaded DLL, VS2005). На некотором этапе нужно прочитать текстовый файл. Делаю это с помощью fopen, gets, fclose(С-функции) - приложение не работает. Попробовал сделать это с помощью ifstream(STL) - тоже самое. Попробовал с помощью CreateFile, ReadFile, CloseHandle(WinApi как я понимаю) - вроде работает, но чтение по строкам влом реализовывать. Вот хочу спросить, почему может не работать с С-функциями? Заранее спасибо. |
|||
|
||||
DjoNIK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: нет Всего: 5 |
Когда создаешь через CreateFile там один из параметров - Share-политика. ОС выставляет на его основе уровень доступа к данному файлу из других процесссов
1) FILE_SHARE_DELETE Разрешает последующие операции открытия объекта, которые требуют доступа к его удалению. В противном случае, другие процессы не смогут открыть объект, если они потребуют доступа к удалению. Если этот флажок не определяется, но объект уже был открыт с доступом для удаления, то функция завершается ошибкой. Windows Me/98/95: Этот флажок не поддерживается. 2) FILE_SHARE_READ Разрешает последующие операции открытия объекта, которые требуют доступа для чтения. В противном случае, другие процессы не смогут открыть объект, если они потребуют доступа для чтения. Если этот флажок не определяется, но объект уже был открыт с доступом для чтения, то функция завершается ошибкой. 3) FILE_SHARE_WRITE Разрешает последующие операции открытия объекта, которые требуют доступа для записи. В противном случае, другие процессы не смогут открыть объект, если они потребуют доступа для записи. Если этот флажок не определяется, но объект уже был открыт с доступом для записи, то функция завершается ошибкой. В стандартных функциях такой возможности нет (или я об это не знаю). Да и зачем тебе CRT, если пишешь под Win32? -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
mad_lollipop, смотри, какую кнопку жмешь, когда ответ пишешь...
Или это на форуме глюки (второй раз уже сегодня модератору ответ приходит вместо ответа в тему). А по сути - что значит, не работает? Берешь отладчик и вперед - код CRT есть, в конце концов все равно CreateFile будет вызвана - другого способа открыть файл в Виндоус нет. Добавлено через 14 минут и 19 секунд Кстати, проверь, правильная ли версия CRT подключена? Может у тебя в основном приложении статическая или не-многопоточная CRT используется... -------------------- ... |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
+1 так-же учесть передачу динамической памяти через границу - при статической линковке CRT память должна освобождаться в том-же модуле где она аллокировалась, а при динамической линковке - соответственно версия DLL должна быть одна и та-же |
|||
|
||||
mad_lollipop |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 5.9.2007 Репутация: нет Всего: нет |
Проблему решил. При работе с fopen я задавал относительный путь - т.е. просто писал имя файла в директории, fopen выглядел след. образом:
fopen("file.txt", "r") Нашел проблему с помощью fopen_s - выдал ошибку с кодом 2 - ENOENT No such file or directory. Попробовал написал абсолютный каталог в fopen, все получилось: fopen("C:\\mydir\\file.txt", "r"). Угу, еще можно использовать SetCurrentDirectory. Спасибо всем. |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: -1 Всего: 14 |
это не портируемо надо использовать chdir |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |