Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспортирование функции с помощью .def файла 
:(
    Опции темы
arfaa
Дата 10.10.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



Здравствуйте,хочу экспортировать функцию с помощью .def файла, с помощью extern "C" _declspec..... экспортировал успешно, хочу реализовать теперь другим способом. Вот мои последовательные действия, где накосячил, подскажите пожалуйста, так как в интеренете везде пишется по разному, начиная от имени dll-ки в def файле и заканчивая обращением к функции в самом проекте.

1. Создаю обычный проект console win32.
2. Создаю библиотеку console win32->DLL->Export Symbols
3. В хидаре библиотеке:

/dll.h
Код
#ifndef DLL_H
#define DLL_H

int summa(int,a,int b)

#endif


4.cpp-ник:

/dll.cpp
Код
#include "stdafx.h"
#include "dll.h"
int summa(int a,int b)
{
return a+b;
}


5. Получаю dll.dll и помещаю в папку с проектом
6. Создаю .def файл

/dll.def
LIBRARY "dll.dll"
EXPORTS summa @1 //(пробовал и просто summa без @1)

7. Помещаю dll.def так же в папку с проектом
8. Код самого проекта

Код
#include<isotream>
using namespace std;
inta main()
{
typedef int (*Fu)(int a, int b)
Fu fu1;
HINSTANCE h;
h=LoadLibraryA("dll.dll");
int a=10;
int b=13;
Fu1=(Fu)GetProcAddress(h,"summa"); // (пробовал и GetProcAdress(h,"1") и GetProcAdress(h,"@1")) 
cout << Fu1(a,b);
system("PAUSE");
}


Так же интересует вопрос экспортирования класса,а не отдельной функции. Импортировать класс у меня не получилось ни декларирование ни .def файлом. 
Спасибо за внимание!

Модератор: не забываем пользоваться кнопочкой "Код"
PM MAIL   Вверх
bsa
Дата 11.10.2012, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



экспортировать класс, а потом подгружать через LoadLibrary у тебя не выйдет. с автоматической загрузкой dll.
Чтобы проблем не было используй атрибуты __dllexport и __dllimport:
/dll.h
Код
#ifndef DLL_H
#define DLL_H

# ifdef BUILD_LIBRARY
#  define DLLPUBLIC __dllexport
# else
#  define DLLPUBLIC __dllimport
# endif

# ifdef __cplusplus
extern "C" {
# endif

DLLPUBLIC int summa(int a, int b);

# ifdef __cplusplus
} //extern "C"
# endif

#endif

/dll.cpp
Код
#include "stdafx.h"
#include "dll.h"
int summa(int a,int b)
{
   return a+b;
}

Код
#include<iostream>
using namespace std;
inta main()
{
   typedef int (*Fu)(int a, int b)
   Fu fu1;
   HINSTANCE h;
   h=LoadLibraryA("dll.dll");
   int a=10;
   int b=13;
   fu1=(Fu)GetProcAddress(h,"summa");
   cout << fu1(a,b);
   system("PAUSE");
}

PM   Вверх
YDean
Дата 11.10.2012, 11:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.9.2009

Репутация: нет
Всего: 1



при создании dll у линкера ключик должен быть /def:dll.def


и в dll.def
после слова
EXPORTS 
перевод строки перед именами функций


Это сообщение отредактировал(а) YDean - 11.10.2012, 11:31
PM   Вверх
arfaa
Дата 11.10.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



В DLL.DLL в заголовочном файле после строчки #define DLL_h добавил строчку #pragma comment(linker,"/def:DLL.def") и соответственно в def файле exports переход на новую строчку /def:dll.def summa @1 в итоге все равно не работает, не видит функции сумма, поправь , если где ошибся, заранее спасибо!
PM MAIL   Вверх
YDean
Дата 11.10.2012, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.9.2009

Репутация: нет
Всего: 1



выражение 
 summa @1 
означает, что функция будет экспортироваться не по имени, а по ординалу с номером 1.
Для экспорта по имени достаточно оставить только имя в def-файле.

Посмотреть, какие функции экспортирует dll, можно посредством утилиты depends.exe из студии.


PM   Вверх
arfaa
Дата 12.10.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



Убрал из деф файла @1, но результат не изменился...
PM MAIL   Вверх
xvr
Дата 12.10.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(arfaa @  12.10.2012,  09:38 Найти цитируемый пост)
Убрал из деф файла @1, но результат не изменился... 

extern "C" в исходнике стоит?

PM MAIL   Вверх
arfaa
Дата 12.10.2012, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



Да ставил в библиотеке перед функцией в срр и в h файлах extern "c",хотя не понимаю назначение, если я использую все модули с++, но в любом случае результат отрицательный
PM MAIL   Вверх
xvr
Дата 12.10.2012, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(arfaa @  12.10.2012,  11:11 Найти цитируемый пост)
хотя не понимаю назначение

extern "C" отменяет С++ декорирование имени. Без него функция у вас будет не summa а что то вроде _Z5summaII

Цитата(arfaa @  12.10.2012,  11:11 Найти цитируемый пост)
но в любом случае результат отрицательный 

Покажите проект, без всех сорцов что то сказать трудно

PM MAIL   Вверх
arfaa
Дата 14.10.2012, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



http://www.fayloobmennik.net/2273531 - полностью проект для библиотеки DLL
http://www.fayloobmennik.net/2273535 - проект, куда подключается данная библиотека
Жду поправок и замечаний.

Это сообщение отредактировал(а) arfaa - 14.10.2012, 14:45
PM MAIL   Вверх
vol4ek
Дата 14.10.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



приложение

Код

#include<iostream>
#include <Windows.h>
using namespace std;
int main()
{
   typedef int (*Fu)(int a, int b);
   Fu fu1;
   HINSTANCE h;
   h=LoadLibraryA("dll.dll");
   if(h==NULL)
   {
       // не удалось загрузить dll
   }
   int a=10;
   int b=13;
   fu1=(Fu)GetProcAddress((HMODULE)h,"summa");
   cout << fu1(a,b);
   system("PAUSE");
   FreeLibrary(h);
   return 0;
}


в dll.h

Код

#ifndef DLL_H
#define DLL_H
extern "C" __declspec(dllexport) int summa(int a,int b);
#endif


в dll.cpp

Код

#include "stdafx.h"
#include "dll.h"

extern "C" __declspec(dllexport) int summa(int a,int b)
{
   return a+b;
}

PM MAIL ICQ   Вверх
arfaa
Дата 14.10.2012, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



смысл мне писать __declspec(dllexport), если я делаю с def файлом?Предложенный тобой код я делал без def файла,да,он абсолютно рабочий, но декларирование,насколько я понимаю и осуществляется с помощью def файла.Иначе смысл def файла,если я говорю внутри def файла, что будет декларировано внутри библиотеки?

Это сообщение отредактировал(а) arfaa - 14.10.2012, 17:11
PM MAIL   Вверх
xvr
Дата 15.10.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(arfaa @ 14.10.2012,  14:23)
http://www.fayloobmennik.net/2273531 - полностью проект для библиотеки DLL
http://www.fayloobmennik.net/2273535 - проект, куда подключается данная библиотека
Жду поправок и замечаний.

dll.def должен лежать в папке с проектом dll, а не simpl ! И для начала подключите его через проект, а не через #pragma comment (для надежности)


PM MAIL   Вверх
arfaa
Дата 16.10.2012, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.10.2012

Репутация: нет
Всего: нет



Теперь даже библиотеку получить не могу. Кинул def файл в проект библиотеки,далее в самой студии в настройках проекта project->properties->configuration properties->linker->module definition file в этой строчке тупо прописал  DLL.def применить и f7 . Fatal error lnk1118: syntax error in 'summa' statement. Что снова не так?
PM MAIL   Вверх
xvr
Дата 16.10.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(arfaa @  16.10.2012,  08:52 Найти цитируемый пост)
Что снова не так? 

Код

LIBRARY "dll.dll"
EXPORTS
       summa


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0922 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.