FreeAndNil вызывает тот же Free. Просто дополнительно присваивает Nil переданной переменной. Грубо говоря, реализация FreeAndNil такая:
Код:
procedure FreeAndNil(var O : TObject);
begin
If Assigned(O) Then O.Free;
O := Nil;
end;
Т.е. ошибка доступа совершенно не связанна с FreeAndNil. Как я понимаю, ты вызываешь FreeAndNil из основной программы. Таким образом, похоже, происходит освобождение памяти, выделенной в DLL, в основном модуле. Отсюда, походу, и ошибка. Я бы попробовал вызывать FreeAndNil из DLL.