На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Dll
    Привет!
    Тут такая проблема, пишу так:
    FILE* file = fopen (filename, "r");
    ...
    func(file);
    ...
    Где-то в DLL
    void func(FILE* source);
    {
    ...int x = fgetc(source);// на этом месте Access Violation
    }

    Функция объявлена так: extern "C" __declspec(dllimport) void func(FILE* source) // в ехе-шнике
    В чем дело? Если func находится в ехе то все ОК, значение указателя при передаче не меняется...
    Спасибо.
      Возможно что dll и exe используют разные варианты CRT (проверь опции)
      и вообще, при использовании CRT желательно чтобы все операции по созданию объектов, работе с ними и удалению находились в одном модуле.
      т.е. лучше сделать так:

      Где-то в DLL

      void func( const char *filename )
      {
           FILE* file = fopen (filename, "r");
           ...

           fclose (file);
      }

      вариант 2:

      в DLL делаешь простой класс, типа того:

      class CFileWork{
           FILE *file;
      public:
           void Open(const char *filename){
                 file = fopen (filename, "r");      
           }
           void Close(){
                 fclose(file);
           }
           
           void Func();//твоя функция
      }

      в этом случае все функции все обращения к CRT расположены в одном модуле и проблем быть не должно.

      ps. Не знаю как в VC но в билдере даже при одинаковых параметрах CRT нельзя вызывать malloc и free в разных модулях,
      приходилось делать подобную конструкцию.
        Может, лучше работать с Win32 API файловыми функциями, принимающими  Handle? Тогда траблов точно не будет!
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0169 ]   [ 16 queries used ]   [ Generated: 24.04.24, 10:51 GMT ]