Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual C++ / MFC / WTL > Dll


Автор: kl 19.02.02, 15:08
Привет!
Тут такая проблема, пишу так:
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 находится в ехе то все ОК, значение указателя при передаче не меняется...
Спасибо.

Автор: zAg 19.02.02, 18:15
Возможно что 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 в разных модулях,
приходилось делать подобную конструкцию.

Автор: Codemaster 20.02.02, 02:38
Может, лучше работать с Win32 API файловыми функциями, принимающими  Handle? Тогда траблов точно не будет!

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)