Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
DLL в VC++ |
Философия, технологии, алгоритмы! |
|
Опции темы |
08.07.2003, 10:03 | #1 |
Форумец
Сообщений: 70
Регистрация: 09.08.2002
Возраст: 46
Не в сети |
DLL в VC++
Пытаюсь создать простенькую DLL в VisualC++.
Проблема в том, что при вызове, приложение не находит точек входа в DLL (не может получить адреса функций). Если же в библиотеке функции без параметров, то все работает. Подозреваю, что это как-то связано с механизмом передачи параметров при вызове (или с несоответствием этих механизмов в DLL и вызывающей программе). Кто сталкивался с такой проблемой или знает в чем может быть дело - подскажите. Если кому не в лом покопаться в исходниках, то библиотеку и вызывающую программу выложу здксь. Если у кого есть работающий пример DLL с вызывающей программой (только что-нибудь по-проще), то вышлите мне на мыло, плз. |
08.07.2003, 12:00 | #2 |
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 42
Не в сети |
Лови.
|
08.07.2003, 14:41 | #3 |
Registered User
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43
Не в сети |
Чтобы компилятор генерировал недекорированные имена функций, использую модификатор __cdecl:
extern "C" __declspec(dllexport) int __cdecl func(int,int) { return 0; } иначе в таблице символов получишь что-то вроде _func@8 |
08.07.2003, 16:23 | #4 | |
Форумец
Сообщений: 334
Регистрация: 14.04.2003
Возраст: 42
Не в сети |
Цитата:
А декорированное имя или нет для эскпорта/импорта DLL не имеет никакого значения. PS. А как же по твоему сделать эспорт целого класса из DLL? Неужели на extern "C"? |
|
08.07.2003, 18:22 | #5 | |||||
Registered User
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43
Не в сети |
Цитата:
Цитата:
"The form of decoration for a C function depends on the calling convention used in its declaration, as shown below. Calling Convention Decoration __cdecl (the default) Leading underscore (_) __stdcall Leading underscore (_) and a trailing at sign (@) followed by a number representing the number of bytes in the parameter list __fastcall Same as __stdcall, but prepended by an at sign instead of an underscore " Цитата:
Цитата:
Цитата:
|
|||||
09.07.2003, 10:23 | #6 |
Форумец
Сообщений: 70
Регистрация: 09.08.2002
Возраст: 46
Не в сети |
RomanPshenichny Fisher Спасибо. Действительно у функций были имена вроде _func@8, поэтому GetProcAddress их не находила (я использовал __stdcall).
Тогда возникает другой вопрос: мне нужно, чтобы функции в библиотеке быть описаны с директивой __stdcall, чтобы вызывающая программа не заботилась об очистке стека (библиотека будет вызываться из VB и еще нескольких довольно экзотических языков - MSM-Workstation и Cache). А можно как-нибудь сделать так, чтобы при этом имена функций не менялись или хотя бы, чтоб не пришлось подсчитывать объем параметров в байтах для того, чтобы угадать имя функции. |
09.07.2003, 11:23 | #7 | ||
Registered User
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43
Не в сети |
Цитата:
Цитата:
|
||
09.07.2003, 20:45 | #8 |
Форумец
Сообщений: 111
Регистрация: 04.02.2003
Не в сети |
Присоединяюсь к Роману и Fisher'у.
Кроме того, рекомендую Вам использовать def файл. За подробностями позвольте Вас отправить в msdn по адресу ms-help://MS.VSCC/MS.MSDNVS/vccore/html/_core_Export_from_a_DLL_Using_..DEF_Files.htm P.S. Господа программеры ни у кого Visual Studio 2003 не найдется? Очень уж хочется попробовать С++ компилятор и насколько он близок к стандарту. |
09.07.2003, 21:30 | #9 |
Форумец
Сообщений: 1,696
Регистрация: 24.11.2002
Возраст: 39
Не в сети |
is
P.S. Господа программеры ни у кого Visual Studio 2003 не найдется? Очень уж хочется попробовать С++ компилятор и насколько он близок к стандарту. Смотри: http://www.u-antona.vrn.ru/forum/sho...0&pagenumber=2 А в студии 7.1(2003) разве другой компилятор в отличии от 7.0 |
09.07.2003, 21:54 | #10 |
Форумец
Сообщений: 111
Регистрация: 04.02.2003
Не в сети |
LSL Да, компилятор С++ другой. Обещали приблизиться к стандарту на 98%. Плюс .net фреймворк v.1.1.
А вот я не понял: как это VS2003 на 8 компактах? Слышал, что по подписке MSDN Universal она занимает 716 или 724 Мб в зип архиве и msdn они на этот раз не включали в поставку. Или в ентерпрайз аркитект все есть? |
11.07.2003, 12:20 | #11 |
Форумец
Сообщений: 70
Регистрация: 09.08.2002
Возраст: 46
Не в сети |
is Спасибо. Попробовал с def-файлом и все получилось.
|
11.07.2003, 16:14 | #12 | ||
Registered User
Сообщений: 67
Регистрация: 08.07.2003
Возраст: 43
Не в сети |
Можно и без .DEF файла обойтись, сделав линковщику явное указание в .cpp файле:
#pragma comment(linker, "/export:func=_func@8") , но это ведь не избавляет от необходимости корректного объявления функции на языке клиента. Fisher добавил [date]1057929538[/date]: Цитата:
Цитата:
|
||