1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

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

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

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

    zeliboba1 Гость

    Репутация:
    0
    Здравствуйте.

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

    Код:
    //**************************** 
    #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, не изменяя пробую запустить - всё Ок, работает.
    Теперь хочу глобально объявить мою структуру из библиотеки и процедуру от туда же.
    Пишу строчки (которые, как замечу, в консольном приложении работаю):

    Код:
     #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

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

    zeliboba1 Гость

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

    -master- Well-Known Member

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

    zeliboba1 Гость

    Репутация:
    0
    После чтения всякого что я знаю:
    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

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

    zeliboba1 Гость

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

    -master- Well-Known Member

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

    zeliboba1 Гость

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

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

    a0z Well-Known Member

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

    zeliboba1 Гость

    Репутация:
    0
    Ок, так в следующий раз и спрошу ;)
     
Загрузка...
Похожие Темы - Проблема __declspec(dllimport)
  1. pack
    Ответов:
    5
    Просмотров:
    41
  2. Alex1994
    Ответов:
    7
    Просмотров:
    106
  3. PingvinPingvin
    Ответов:
    10
    Просмотров:
    112
  4. Free2playman
    Ответов:
    14
    Просмотров:
    133
  5. Дмитрий17
    Ответов:
    10
    Просмотров:
    191
Статус темы:
Закрыта.

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