Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Офтопик > Мысли вслух
Перезагрузить страницу Разработка и использование DLL
Ответ
 
Опции темы Опции просмотра
  (#31 (permalink)) Старый
Gorbach Gorbach вне форума
Member
 
Сообщений: 67
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.10.2005
По умолчанию 09.11.2005, 03:08

Я имел ввиду то, что в описании импортируемой функции отсутствует ключевое слово const, тогда как в dll const присутствует
Код:
extern __declspec(dllexport) int getSum(const int n1,const int n2);

int getSum(const int n1,сonst int n2)
{
return n1+n2;
}
Соответственно при импортирировании функции ее прототип должен также содержать ключевое слово const
Код:
int DLL_SPEC getSum(const int, const int);
У меня потому и не собиралось приложение (C++Builder 5):
[Linker Error] Unresolved external 'getSum(int,int)' referenced from...

В примере для VC++, Delphi вы про const не забываете, а в примере для Builder'а забыли.
Ответить с цитированием
  (#32 (permalink)) Старый
Shunix Shunix вне форума
Member
 
Сообщений: 1,355
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.06.2002
По умолчанию 01.12.2005, 01:00

Отлично! Все необходимые изменения внесены в тексты статьи, так что Вы были правы, что эта ошибка действительно имела место быть! Кстати, пользуясь случаем, подправили некоторые другие моменты, связанные с не вполне корректным отображением в Firefox.
Так что еще раз спасибо за замечания! Надеюсь, именно они послужат вдохновением к выпуску следующей главы этой статьи, компоновка и рецензирование которой сейчас в самом разгаре! (Не представляете, каких невероятных и героических трудов стоит заставить некоторых людей работать! Впрочем, надо заметить, они стараются и работают над собой!! ;-) )
Ответить с цитированием
  (#33 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 13.02.2006, 13:48

Обновление.

Выложена полная версия 4й главы статьи:
http://www.hardforum.ru/f22/
Комментарии и критика как всегда приветствуются.

Ответить с цитированием
  (#34 (permalink)) Старый
just_vladimir just_vladimir вне форума
Member
 
Сообщений: 420
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2006
По умолчанию 03.01.2007, 00:07

Вобщем все замечательно, честно мне понравилось, давно хотел почитать нечто подобное. Но с моей точки зрения так как это все написано для людей начинающих(к коим я и отношусь), есть небольшие недочеты.

Все что будет сказано далее, будет сказано с позиции человека который раньше не имел ни малейшего опыта общения с dll.

Переход от идеологии dll ее плюсов и минусов к их реальному применению, предлагается банально скопировать код без особых разъяснений. Я думаю как раз этот момент наоборот быть наиболее подробно изложен(кстати скопировал все это для VSC++ 6.0 и у меня все благополучно не скомпилилось). Потом здесь же
Код:
ifndef __XDLL_H
#define __XDLL_H
#ifdef XDLL6_EXPORTS
#define XDLL_API __declspec(dllexport)
#else
#define XDLL_API __declspec(dllimport)
#endif XDLL_API int getSum(const int n1, const int n2);
#endif
почему то мне кажется, что все эти удобные ухишрения плохо воздействуют на начальное понимание. Не стоило ли все честно написать и пояснить, а потом сказать, что мол можно зделать так.

Еще хотелось бы по подробней про стандарты, и лучше бы чтобы это было поближе к началу(хотя конечно вопрос, что легче понять индукцию или дедукцию)

Потом очень тяжко воспринимать когда подряд идет VSC++, Borland C++, Delphy... Как нить бы отделить их или что... С одной стороны конечно это плюс сравнение реализаций в разных средах, но только когда хорошо всеми ими владееш. А когда приходится пролистывать, то можно и лишнего случайно пролистать.

Дальше чего бы хотелось еще узнать... В статье видел как использовать данные из dll в управляемом коде, но вот можно ли например dll из .net использовать как обычную dll? Что она из себя представляет, она такая же?Это код на MSIL или двоичный?
Ответить с цитированием
  (#35 (permalink)) Старый
just_vladimir just_vladimir вне форума
Member
 
Сообщений: 420
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2006
По умолчанию 03.01.2007, 00:07

Вобщем все замечательно, честно мне понравилось, давно хотел почитать нечто подобное. Но с моей точки зрения так как это все написано для людей начинающих(к коим я и отношусь), есть небольшие недочеты.

Все что будет сказано далее, будет сказано с позиции человека который раньше не имел ни малейшего опыта общения с dll.

Переход от идеологии dll ее плюсов и минусов к их реальному применению, предлагается банально скопировать код без особых разъяснений. Я думаю как раз этот момент наоборот быть наиболее подробно изложен(кстати скопировал все это для VSC++ 6.0 и у меня все благополучно не скомпилилось). Потом здесь же
Код:
ifndef __XDLL_H
#define __XDLL_H
#ifdef XDLL6_EXPORTS
#define XDLL_API __declspec(dllexport)
#else
#define XDLL_API __declspec(dllimport)
#endif XDLL_API int getSum(const int n1, const int n2);
#endif
почему то мне кажется, что все эти удобные ухишрения плохо воздействуют на начальное понимание. Не стоило ли все честно написать и пояснить, а потом сказать, что мол можно зделать так.

Еще хотелось бы по подробней про стандарты, и лучше бы чтобы это было поближе к началу(хотя конечно вопрос, что легче понять индукцию или дедукцию)

Потом очень тяжко воспринимать когда подряд идет VSC++, Borland C++, Delphy... Как нить бы отделить их или что... С одной стороны конечно это плюс сравнение реализаций в разных средах, но только когда хорошо всеми ими владееш. А когда приходится пролистывать, то можно и лишнего случайно пролистать.

Дальше чего бы хотелось еще узнать... В статье видел как использовать данные из dll в управляемом коде, но вот можно ли например dll из .net использовать как обычную dll? Что она из себя представляет, она такая же?Это код на MSIL или двоичный?
Ответить с цитированием
Ads.
  (#36 (permalink)) Старый
SH@DOW SH@DOW вне форума
Member
 
Сообщений: 2,085
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.09.2002
По умолчанию 14.06.2007, 15:55

И на этом история написания статьи закончилась
Ответить с цитированием
Ads
  (#37 (permalink)) Старый
Shunix Shunix вне форума
Member
 
Сообщений: 1,355
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.06.2002
По умолчанию 08.02.2008, 01:15

Подготовлен очередной (пятый по счету) том произведения под названием Написание и использование DLL в различных средах. Надеюсь, материал этой главы покажется кому-то не только интересным, но и необходимым - со своей стороны, во время ее подготовки мы почерпнули для себя много нового и интересного (чего стоит хотя бы закон РФ 3523-1 :) ).

От себя лично хотелось бы поблагодарить всех, кто был с этой статьей до конца - имена героев должны быть озвучены во всеуслышанье здесь и сейчас - искреннее спасибо Игорю (Garik) и Владимиру (Влад) за все их мучения до самого конца :). Это было не только увлекательно, но и интересно :).
Ответить с цитированием
  (#38 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 08.02.2008, 05:34

Авторам респект!
P.S. материал пока не осилил
Ответить с цитированием
  (#39 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,275
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.02.2008, 03:10

Цитата:
Подготовлен очередной (пятый по счету) том произведения под названием Написание и использование DLL в различных средах.
Однако приведенный для иллюстрации конвенции вызова "подробный" код
Код:
Func:
    ...
   ; очистка стека
    pop argN
    ...
    pop arg2
    pop arg1
   ; возврат
    ret
работать не будет: вся фишка в том, что нужно сначала выполнить возврат, а потом уже очистку стека. И сделать это правильно можно только командой ret с параметром
Ответить с цитированием
  (#40 (permalink)) Старый
Shunix Shunix вне форума
Member
 
Сообщений: 1,355
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.06.2002
По умолчанию 13.02.2008, 23:31

Спасибо за ответ.

Что касается указанного замечания, то позволю не согласится по двум причинам. Во-первых, в статье четко оговорено, что речь идет о псевдокоде:
Цитата:
Приведем следующие варианты псевдокода для каждого возможного случая (Таблица 5.1).
Соответственно, никаких гарантий, а также правил относительно того, как данный псевдокод преобразуется в реальный код не оговорено.
Вторая причина напрямую связана с первой - в качестве исполняемой модели не обязательно будет использована модель платформы x86, где работа с функциями осуществляется методом записи регистра команд в разделяемый с данными стек. И справедливо это, на мой взгляд, опять-таки по причине разговора на языке "псевдокода" - в данном случае мы можем проецировать эту последовательность команд на псевдокоде на любую архитектуру - где, возможно, наличие отдельного стека для регистра команд, например.
Что касается поведения реальных компиляторов - то и этот момент в статье озвучен отдельно - см. следующее за этим замечание.
Ответить с цитированием
  (#41 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,275
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 14.02.2008, 01:03

Цитата:
наличие отдельного стека для регистра команд, например.
Согласен, такую возможность не учел.

И все-таки мне кажется, что приведенный код может ввести в заблуждение относительно требуемой последовательности операций. В том случае, если стек все же один.
Ответить с цитированием
  (#42 (permalink)) Старый
Clickgg Clickgg вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 19.07.2011
По умолчанию 18.08.2011, 21:14

не могу открыть линк пишет страница не найденна
Ответить с цитированием
  (#43 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.02.2012, 05:50

Как избежать декорирования имён функций c вызовом _stdcall?
extern "C" решает проблему только частично: вместо "?func@@YGHPAD@Z" , будет "func@4" (или "_func@4", в зависимости от компилятора), а не func, как хотелось бы.

pragma тоже не помогает. Ни так:
#pragma comment (linker, "/export:func = ?func@@YGHPAD@Z")
ни так:
#pragma comment (linker, "/export:func = func@4")

DEF тоже не помогает ни в одном из вариантов:

Цитата:
EXPORTS
func = func@4
Цитата:
EXPORTS
func
На этот вопрос даются именно такие ответы. Других вариантов ответов в сети найти не удалось.
Проблема касается и GCC, и DMC. Проблемы нет только в VC.

PS: при этом, она работает, если вызвать func.

Последний раз редактировалось Бобо; 17.02.2012 в 06:43
Ответить с цитированием
  (#44 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,275
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 17.02.2012, 08:33

Странно. Первая же строка в поиске выдает такое решение:
Цитата:
Just use -Wl,--kill-at on the gcc command line, which will pass --kill-at to the linker.
Ответить с цитированием
  (#45 (permalink)) Старый
Бобо Бобо вне форума
Member
 
Сообщений: 387
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.02.2012, 10:35

По какому запросу?

Цитата:
Я перенести на ваше мнение здесь. Я хотел бы отметить, что он взял меня много копать, чтобы придумать решение. Один маленький намек на другие могли бы спасти их лодка времени.

Мне не удалось найти любую информацию по этому вопросу сверху вниз контроль руководства GCC, которая делает не дает широкое обсуждение конкретных Windows- особенности. Вместо этого он отсылает читателей к Cygwin где я подозреваю, что большинство ищущих поедет. Сайт Поиск ничего не дает для gcc.gnu.org дополнения STDCALL псевдоним или kill-на.
Сообщения на русском языке не особо сильно отличаются.

Ничего не даёт.
Как я понимаю из следующего, это касается вызовов по порядковому номеру.

Цитата:
Указывает, что при `dlltool" создает
Экспорт файла не должен добавить строку
`@ <number>. Эти цифры называются
порядковые номера, и они представляют собой еще один
способ доступа к этой функции в DLL и другие
чем по имени.

Последний раз редактировалось Бобо; 17.02.2012 в 10:56
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка социальных игр patap Работа 0 23.08.2011 20:03
Разработка - СУБД fdb Nfox Другие СУБД 1 22.07.2011 13:16
Разработка приложений Lisska C++ Builder 1 08.06.2011 07:01
разработка флеш игр igoryan777 Компьютерные игры 1 09.12.2010 20:43
Разработка игр may_yuliya Компьютерные игры 0 16.09.2010 21:26
Разработка компонент KVL Delphi 2 06.05.2010 10:28
Разработка программ ProCodeService Работа 0 08.04.2009 15:03
Разработка FireWall Dian Visual C++ 1 01.10.2004 09:21
Разработка игры Anonymous Некоммерческие проекты 1 17.09.2004 15:41
Разработка - СУБД fdb Алексеев Николай Некоммерческие проекты 1 27.08.2004 02:23
Разработка БД на заказ Улисс Работа 0 20.08.2004 12:19
Разработка ПО и спецвычислителей SergeySS Работа 0 17.08.2004 17:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов