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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fopen и Multithreaded DLL, В проекте не работает fopen 
:(
    Опции темы
mad_lollipop
Дата 7.10.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем.
Возникла проблема:
Есть многопоточное приложение(Multithreaded DLL, VS2005). На некотором этапе нужно прочитать текстовый файл.
Делаю это с помощью fopen, gets, fclose(С-функции) - приложение не работает.
Попробовал сделать это с помощью ifstream(STL) - тоже самое.
Попробовал с помощью CreateFile, ReadFile, CloseHandle(WinApi как я понимаю) - вроде работает, но чтение по строкам влом реализовывать.
Вот хочу спросить, почему может не работать с С-функциями?
Заранее спасибо.
PM MAIL   Вверх
DjoNIK
Дата 7.10.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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?


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Earnest
Дата 7.10.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



mad_lollipop, смотри, какую кнопку жмешь, когда ответ пишешь... 
Или это на форуме глюки (второй раз уже сегодня модератору ответ приходит вместо ответа в тему).
А по сути - что значит, не работает? Берешь отладчик и вперед - код CRT есть, в конце концов все равно CreateFile будет вызвана - другого способа открыть файл в Виндоус нет.

Добавлено через 14 минут и 19 секунд
Кстати, проверь, правильная ли версия CRT подключена? Может у тебя в основном приложении статическая или не-многопоточная CRT используется...


--------------------
...
PM   Вверх
J0ker
Дата 7.10.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Earnest @  7.10.2008,  20:49 Найти цитируемый пост)
Кстати, проверь, правильная ли версия CRT подключена? Может у тебя в основном приложении статическая или не-многопоточная CRT используется... 

+1
так-же учесть передачу динамической памяти через границу - при статической линковке CRT память должна освобождаться в том-же модуле где она аллокировалась, а при динамической линковке - соответственно версия DLL должна быть одна и та-же


--------------------
user posted image
PM MAIL   Вверх
mad_lollipop
Дата 8.10.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.
Спасибо всем.

 
PM MAIL   Вверх
J0ker
Дата 8.10.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mad_lollipop @  8.10.2008,  10:12 Найти цитируемый пост)
Угу, еще можно использовать SetCurrentDirectory.

это не портируемо
надо использовать chdir


--------------------
user posted image
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.

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


 




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


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

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