Проблема С __declspec(dllimport)

Тема в разделе "MS Visual C++", создана пользователем zeliboba1, 10 фев 2012.

Статус темы:
Закрыта.
  1. zeliboba1

    zeliboba1 Гость

    Здравствуйте.

    Есть библиотека, которую подключаю к программе на с++
    (http://forum.ru-board.com/topic.cgi?forum=...mit=1&m=1#1).
    Из этой библиотеки делаю импорт структуры и процедуры.
    Программу создавал как "пустой проект", выглядит она так:

    Код (C++):
    //****************************
    #include <iostream>
    #pragma comment(lib,"fdll.lib")
    using namespace std;

    Extern "C" {
    extern __declspec(dllimport) struct variables { double a; } abc;
    void F();
    }

    int main()
    {
    F();
    std::cout<<abc.a;
    return 0;
    }

    //***************************
    Это её рабочий вариант, т.е. в качестве _консольного_ приложения она корректно работает, не выдает предупреждений при сборке.

    Теперь встала проблема использовать структуру и функция в приложении типа Windows Forms.
    Создаю стандартное приложение Windows Forms, не изменяя пробую запустить - всё Ок, работает.
    Теперь хочу глобально объявить мою структуру из библиотеки и процедуру от туда же.
    Пишу строчки (которые, как замечу, в консольном приложении работаю):

    Код (C++):
     #pragma comment(lib,"fdll.lib")
    Extern "C" {
    extern __declspec(dllimport) struct variables { double a; } abc;
    void F();
    }
    Добавляю их в главный файл .cpp, до функции main().
    При сборке получаю предупреждение вида:

    warning C4394: abc: символ для каждого домена приложений не следует помечать с помощью __declspec(dllimport)

    соответственно при попытке использования импортированной структуры и процедуры - ошибки.

    прошу подсказки, в чем дело? почему в консольном приложении работает как положено, а в Windows Forms нет, при том что
    располагаю объявление структуры, как мне кажется, в одном и том же месте... MS VS 2008
     
  2. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Не волнуйся, тут полно телепатов. Сообщение об ошибке им не нужно, сами догадаются.
    Жди.
     
  3. zeliboba1

    zeliboba1 Гость

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

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Так а в справке что написано по этому поводу?
     
  5. zeliboba1

    zeliboba1 Гость

    После чтения всякого что я знаю:
    1) описание предупреждения http://msdn.microsoft.com/ru-ru/library/ms173692.aspx , но это не шибко выручает.
    2) как я понял, настройка среды для каждого типа приложений свои, поэтому подобные вещи и возникают.
    http://msdn.microsoft.com/ru-ru/library/ms...1(v=vs.90).aspx там есть вот такой интересный пункт:
    после этих манипуляций предупреждение исчезает! НО теперь появляется ошибка:
    что собственно неудивительно, т.к. структуры с названием __imp__abc у меня в библиотеки нет.
    позже попробую сделать alias в самой библиотеке, но логика подсказывает что дело не в этом, а возможно
    в каких-то настройках ещё (ведь в варианте консольного приложения работает). Но в чем именно дело
    из-за малого опыта понять не могу пока.

    есть какие-нибудь мысли? решение, полагаю, где-то рядом.
     
  6. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
  7. zeliboba1

    zeliboba1 Гость

    Вы об отом "Try to set CLR switch to /clr (without pure and safe)"?
    я так сделал, это и помогло мне убрать warning, но теперь ошибка, из-за того что линковщик добавляет мне _imp_
     
  8. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    А сравните настройки линковщика, в консольном и тут.
     
  9. zeliboba1

    zeliboba1 Гость

    Так, с этой проблемой разобрался. Не знаю насколько это колхозно вышло, но работает.
    Что надо сделать:
    1) Разверните узел Свойства конфигурации и выберите пункт Общие. Справа, в области Значения по умолчанию для проекта установите для параметра Поддержка общеязыковой среды выполнения (CLR) значение Поддержка общеязыковой среды выполнения (/clr).
    2) Свойства проекта -> Свойства конфигурации -> с/с++ -> предварительно скомпилированные заголовки -> не использовать

    -master, спасибо за участие. карму плюсануть не получается:/
     
  10. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Я опять таки повторяюсь, что вы пишете телепатам.
    У вас в вопросе ясно сказано "почему в консольном приложении работает как положено, а в Windows Forms нет". Если не работает и интересно почему - давайте ошибки.
    Если интересно почему возникает варнинг, так и спросите.
     
  11. zeliboba1

    zeliboba1 Гость

    Ок, так в следующий раз и спрошу ;)
     
Загрузка...
Похожие Темы - Проблема __declspec(dllimport)
  1. c0de3r
    Ответов:
    5
    Просмотров:
    119
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    133
  3. SoulPaladin
    Ответов:
    3
    Просмотров:
    122
  4. Artael
    Ответов:
    1
    Просмотров:
    109
  5. ENSLER
    Ответов:
    0
    Просмотров:
    102
Статус темы:
Закрыта.

Поделиться этой страницей