• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы zeliboba1
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Z

zeliboba1

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

Есть библиотека, которую подключаю к программе на с++
( ).
Из этой библиотеки делаю импорт структуры и процедуры.
Программу создавал как "пустой проект", выглядит она так:

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
 
A

a0z

Не волнуйся, тут полно телепатов. Сообщение об ошибке им не нужно, сами догадаются.
Жди.
 
Z

zeliboba1

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

-master-

Так а в справке что написано по этому поводу?
 
Z

zeliboba1

Так а в справке что написано по этому поводу?

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

после этих манипуляций предупреждение исчезает! НО теперь появляется ошибка:
test.obj : error LNK2020: неразрешенная лексема (0A00000E) __imp__abc
test.obj : error LNK2001: неразрешенный внешний символ "__imp__abc"
что собственно неудивительно, т.к. структуры с названием __imp__abc у меня в библиотеки нет.
позже попробую сделать alias в самой библиотеке, но логика подсказывает что дело не в этом, а возможно
в каких-то настройках ещё (ведь в варианте консольного приложения работает). Но в чем именно дело
из-за малого опыта понять не могу пока.

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

-master-

а так ?
 
Z

zeliboba1

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

-master-

А сравните настройки линковщика, в консольном и тут.
 
Z

zeliboba1

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

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

a0z

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

Я опять таки повторяюсь, что вы пишете телепатам.
У вас в вопросе ясно сказано "почему в консольном приложении работает как положено, а в Windows Forms нет". Если не работает и интересно почему - давайте ошибки.
Если интересно почему возникает варнинг, так и спросите.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!