|
|
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
(компилятор Visual C++) В MSDN сказано, что существуют два способа экспорта функций из dll: - используя ключевое слово __declspec(dllexport) при объявлении функции в dll; - либо с помощью файла def. Однако, я столкнулся с проблемой: у меня без файла def функция не экспортируется даже при использовании первого способа. Пример (из какого-то источника). mydll.h Код: plaintext 1. 2. mydll.cpp Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. myapp.cpp Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Оба проекта (библиотечный и приложения прекрасно построились), однако при выполнении приложения myapp возникает исключение в блоке try во время попытки вызвать функцию из dll. При пошаговой отладке видно, что при получения адреса нужной функции из dll, указатель становится равным нулю. Однако если добавить в проект dll файл def следующего содержания: mydll.def Код: plaintext 1. 2. 3. 4. все становится на свои места и функция нормально вызывается из программы myapp хоть по имени, хоть по номеру функции. В чем тут, дело? ведь в MSDN явно сказано: If you use __declspec(dllexport), you do not need a .DEF file for exports. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2004, 18:38 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. А что это значит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2004, 09:56 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
автор- используя ключевое слово __declspec(dllexport) при объявлении функции в dll; Соответственно, там где импортируешь, надо сделать описание как: __declspec(dllimport) Кстати, когда даже в VC создаёшь проект (не помню какой) для длл-ки. Она(VS) расписывает три експортируемые вещи: переменную, функцию и класс. При этом заводится(типа) #define MY_EXPORT и потом в заголовке #ifdef MY_EXPORT #define _import_def __declspec(dllexport) #else #define _import_def __declspec(dllimport) #endif Таким образом, можно этот заголовочный файл использовать как в самом проекте, так и в проектах для имопорта вещей из него. Попровьте, если я чего не так сказал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2004, 10:24 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
CEMb Сказал все так - только вот Guilty использует динамическое связывание а dllimport - статическое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2004, 10:47 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
думаю, дело тут совсем не в методе линковки, а в т.н. naming decoration т.е., CALLBACK означает FAR PASCAL, следовательно имя ф-ии экспортируется без DEF-файла как _MyFunction@4 (и GetProcAddress не прокатывает), а с этим файло - как MyFunction и все работает. 2 Guilty: оба случая необходимо проверить с помощью Dependency Walker конечно или подобной. imho. удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2004, 14:27 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
Я согласен с funikovyuri . Скажу подробнее: 1) для использования LoadLibrary/GetProcAddress запись в def-файле необходима; 2) без записи в def-файле можно вызвать dllexport функцию, только если слинковать exe с lib-файлом dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2004, 15:36 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
2 funikovyuri автор >PFN_MyFunction pfnMyFunction; >pfnMyFunction = (PFN_MyFunction)::GetProcAddress(hMyDll, "MyFunction"); >А что это значит? 1 строка: Объявление указателя на функцию 2 строка: получение адреса функции и приведение к объвленному указателю. 2 ALL Похоже все дело, как правильно заметил maratka (большое спасибо ему за это), в декорировании имени функции. Компилятор по разному декорирует имена при компиляции C модулей и C++ модулей. (CALLBACK перед функцией я вообще убрал) Пример: 1) берем проект mydll с двумя файлами в нем mydll.h и mydll. cpp (файл mydll.def - выбрасываем), строим, потом смотрим, что внутри mydll.dll dumpbin /exports mydll.dll получаем имя функции ?MyFunction@@YAHPAD@Z 2) берем тот же проект, однако файл mydll. cpp заменяем точно таким же mydll. c (файл mydll.def по прежнему отсутствует), строим, смотрим: dumpbin /exports mydll.dll получаем имя функции MyFunction Теперь функция нормально вызывается из приложения myapp.exe по имени MyFunction. 2 Ой Вэй Так что похоже файл def все-таки не обязателен для динамического использования функций из dll? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2004, 00:00 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
Не понял... Декларация как FAR ведёт к экспорту функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2004, 10:39 |
|
||
|
Почему не экспортируется функция из dll без def-файла?
|
|||
|---|---|---|---|
|
#18+
действительно, я немного поторопился, если ф-я не определена как extern "C", то линкер генерирует расширенное имя ф-ии, типа ?MyFunction@@YAHPAD@Z, а для *.с-файлов определен язык С по умолчанию. так что я всегда определяю экспортируемые ф-ии как extern "C". FAR в вин32 устарел и ни чему не соответствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2004, 11:19 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32381058&tid=2035507]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 361ms |

| 0 / 0 |
