powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему не экспортируется функция из dll без def-файла?
10 сообщений из 10, страница 1 из 1
Почему не экспортируется функция из dll без def-файла?
    #32379561
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(компилятор Visual C++)
В MSDN сказано, что существуют два способа экспорта функций из dll:
- используя ключевое слово __declspec(dllexport) при объявлении функции в dll;
- либо с помощью файла def.
Однако, я столкнулся с проблемой: у меня без файла def функция не экспортируется даже при использовании первого способа.

Пример (из какого-то источника).
mydll.h
Код: plaintext
1.
2.
#define EXPORT __declspec(dllexport)
EXPORT int CALLBACK MyFunction(char* str);

mydll.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <windows.h>
#include  "mydll.h" 

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) 
{
  return TRUE;
};

EXPORT int CALLBACK MyFunction(char *str)
{
  Beep( 500 ,  100 );
  MessageBox(NULL, str,  "Function from DLL" , MB_OK);
 	return  1 ;
}

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.
#include <windows.h >

typedef int (WINAPI *PFN_MyFunction) (char *);

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
  HINSTANCE hMyDll;

  if((hMyDll = ::LoadLibrary( "mydll" ))==NULL)
  {
    MessageBox(NULL,  "Cannot load dll!" ,  " " , MB_OK);
    return  1 ;
  }

  PFN_MyFunction pfnMyFunction;

  pfnMyFunction = (PFN_MyFunction)::GetProcAddress(hMyDll,  "MyFunction" );

  try
  {
    int iCode = (*pfnMyFunction)( "Successful execution of dll function!" );
  }
  catch(...)
  {
    MessageBox(NULL,  "Error!" ,  " " , MB_OK);
  }
  ::FreeLibrary(hMyDll);

  return  0 ;
}


Оба проекта (библиотечный и приложения прекрасно построились), однако при выполнении приложения myapp возникает исключение в блоке try во время попытки вызвать функцию из dll. При пошаговой отладке видно, что при получения адреса нужной функции из dll, указатель становится равным нулю. Однако если добавить в проект dll файл def следующего содержания:

mydll.def
Код: plaintext
1.
2.
3.
4.
LIBRARY mydll

EXPORTS
  MyFunction  @ 1 

все становится на свои места и функция нормально вызывается из программы myapp хоть по имени, хоть по номеру функции.
В чем тут, дело? ведь в MSDN явно сказано: If you use __declspec(dllexport), you do not need a .DEF file for exports.
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32379783
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
PFN_MyFunction pfnMyFunction;

pfnMyFunction = (PFN_MyFunction)::GetProcAddress(hMyDll,  "MyFunction" );


А что это значит?
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32379812
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор- используя ключевое слово __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

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

Попровьте, если я чего не так сказал :)
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32379848
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb

Сказал все так - только вот Guilty использует динамическое связывание а dllimport - статическое
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32380346
maratka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю, дело тут совсем не в методе линковки, а в т.н. naming decoration т.е.,
CALLBACK означает FAR PASCAL, следовательно имя ф-ии экспортируется
без DEF-файла как _MyFunction@4 (и GetProcAddress не прокатывает), а с
этим файло - как MyFunction и все работает.
2 Guilty: оба случая необходимо проверить с помощью Dependency Walker конечно или подобной.
imho. удачи.
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32380531
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я согласен с funikovyuri .
Скажу подробнее:
1) для использования LoadLibrary/GetProcAddress запись в def-файле необходима;
2) без записи в def-файле можно вызвать dllexport функцию, только если слинковать exe с lib-файлом dll.
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32381058
Guilty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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? ;)
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32381288
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял...
Декларация как FAR ведёт к экспорту функции?
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32381394
maratka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
действительно, я немного поторопился, если ф-я не определена как extern "C",
то линкер генерирует расширенное имя ф-ии, типа ?MyFunction@@YAHPAD@Z, а для *.с-файлов определен язык С по умолчанию. так что я всегда определяю экспортируемые ф-ии как extern "C".
FAR в вин32 устарел и ни чему не соответствует.
...
Рейтинг: 0 / 0
Почему не экспортируется функция из dll без def-файла?
    #32382599
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно, спасибо :)

Одним типом файлов меньше :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему не экспортируется функция из dll без def-файла?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]