На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Экспорт функции из dll , не получается экспортировать фцию, возвращающую указатель.
    Мне нужно создать dll и в ней одну функцию экспортировать. не получается.. и не пойму в чем дело.
    Приведу простейший пример:

    ExpandedWrap disabled
      //h-файл
      int* __declspec(dllexport) function();
       
      //cpp-файл
      int* function()
      {
      static int var=5;
      return &var;
      }

    На этот код компилятор ругается "error C2059: syntax error : '__declspec(dllexport)'" Почему?

    ЗЫ: на всякий случай - в реале, конечно, используется не эта функция, а посложнее:
    ExpandedWrap disabled
      extern "C" IUnknown* __declspec(dllexport) CreateInstance()
      {
          IUnknown* pI = static_cast<IX*>(new CA) ;
          pI->AddRef() ;
          return pI ;
      }

    В двух словах - надо в DLL расположить COM-компонент и через эту экспортируемую функцию вернуть указатель на стандарный интерфейс, чтобы в дальнейшем с ним работать.. впрочем сути это не меняет и компилятор выдает ту-же ошибку, ругаясь на возвращаемый указатель.
      Перенеси __declspec в начало декларации функции.

      Добавлено
      И добавь void в список параметров. Иначе внезапно получишь декларацию переменной.
        Большое спасибо! В варианте
        ExpandedWrap disabled
          //h-файл
          extern "C" __declspec(dllexport) IUnknown* CreateInstance(void);

        все заработало..

        Можно еще небольшой вопрос, который меня смущает?
        В h-файле у меня у меня лежит полное объяление фции - т.е. и с extern "C", и с __declspec(dllexport). А в cpp-файле определить функцию можно двумя способами:

        ExpandedWrap disabled
          extern "C" __declspec(dllexport) IUnknown* CreateInstance(void){/* код фции */};    //так
          IUnknown* CreateInstance(void){/* код фции */};    //или так..

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

          Кстати, уверен, что компилятор в этом месте даже предупреждения не выдает?
            Спасибо :). Не выдает: warning-ов - ноль.
              Может у тебя эти варнинги просто не включены?
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0.0715 ]   [ 16 queries used ]   [ Generated: 27.04.26, 08:28 GMT ]