Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему не экспортируется функция из dll без def-файла? / 10 сообщений из 10, страница 1 из 1
18.01.2004, 18:38
    #32379561
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не экспортируется функция из dll без def-файла?
(компилятор 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
19.01.2004, 09:56
    #32379783
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не экспортируется функция из dll без def-файла?
Код: plaintext
1.
2.
PFN_MyFunction pfnMyFunction;

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


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

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

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


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