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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический импорт DLL в MinGW 
V
    Опции темы
jhonyxakep
Дата 27.2.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

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



 smile Опять ЙА....
Написал тестовую длл (функция string test(void); тупо возвращает строку "test,test":))
Решил динамически её импортировать из длл:
Код

typedef double (*importFunction)(void);

int main(int argc, char *argv[])
{
    importFunction test;
     //double result;
 
     /* Çàãðóæàåì DLL â ïàìÿòü */
     HINSTANCE hinstLib = LoadLibrary("dllka.dll");
     if (hinstLib == NULL) {
         printf("ERROR: unable to load DLL\n");
         return 1;
     }
 
     /* Ïîëó÷àåì óêàçàòåëü íà ôóíêöèþ */
     test = (importFunction)GetProcAddress(hinstLib, "test");
     if (test == NULL) {
         printf("ERROR: unable to find DLL function\n");
         return 1;
     }
 
     /* Âûçûâàåì ôóíêöèþ ÷åðåç óêàçàòåëü */
     cout << test() <<endl;
 
     /*
      * Âûãðóæàåì DLL (â ïðèíöèïå, ýòî áóäåò ñäåëàíî
      * àâòîìàòè÷åñêè ïðè âûõîäå èç ïðîãðàììû)
      */
     FreeLibrary(hinstLib);
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

(код взят с инета)

в результате я получаю фатальную ошибку (в прикреплении)

Кстати это вторая моя попытка использовать динамическое подключение, и всегда такой результат.

ЗЫ Юзаю extern "C" перед экспортом.

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



ты определись, что возвращает функция: строку или double.
Если в самой dll-ке строку, то понятно, почему не работает


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ThisIsSparta
Дата 27.2.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если extern "C", то имя функции должно быть примерно таким: "_test@0". 
Попробуй так:
Код
test = (importFunction)GetProcAddress(hinstLib, "_test@0");

EDIT:
в dll функция должна быть проэкспортирована:
Код
extern "C" string void __declspec(dllexport) test(void);


Это сообщение отредактировал(а) ThisIsSparta - 27.2.2010, 19:29
PM MAIL   Вверх
borisbn
Дата 28.2.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



ThisIsSparta, extern "C" как раз указывает, что функция не должна декорироваться
а твой пример:
extern "C" string void ...
не будет компилироваться


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ThisIsSparta
Дата 28.2.2010, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хм. Пример-то скомпилировался, но с предупреждением "'identifier1' has C-linkage specified, but returns UDT 'identifier2' which is incompatible with C ".
Мда... Действительно имя задается как есть, но... Почему я ошибся? Просто недавно тоже экспериментировал с линковками, но экспериментировал с __stdcall-функциями. В __cdecl все происходит так, как Вы сказали - имя не декодируется. А что будет, если попробовать вот такую функцию?
Код
extern "C" void  __declspec(dllexport) __stdcall test(int x, int x1)
{
}

Она будет проэкспортирована с именем:
Код
_test@8

 8 - это выравнивание стека. Хотя сильно во всю эту радость не влазил. Возможно, это просто особенности линкера MSVC...
PM MAIL   Вверх
jhonyxakep
Дата 28.2.2010, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

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



Цитата(borisbn @  27.2.2010,  16:17 Найти цитируемый пост)
ты определись, что возвращает функция: строку или double.

 smile Ой, сорь, действительно, не знаю как так мог ошибится...

ThisIsSparta, действительно я для того и ставил extern "C" что бы функция была более менее красивого вида.

 smile А так все запахало!!!!

 smile Досадная ошибка с double.

Добавлено через 1 минуту и 26 секунд
Цитата(ThisIsSparta @  27.2.2010,  19:28 Найти цитируемый пост)
в dll функция должна быть проэкспортирована:код C++1:extern "C" string void __declspec(dllexport) test(void);

А я что, не экспортирую???smile
Код

#include <windows.h>
#include <iostream.h>

using namespace std;

extern "C" __declspec (dllexport) string test(void);
string test(void)
{
return "testing 123";
}

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{

    return TRUE;
}


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


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

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



Цитата(ThisIsSparta @  28.2.2010,  01:25 Найти цитируемый пост)
_test@8

по моему это все таки линковка в стиле C++. А вот что дают названия функций в таком стиле?
PM MAIL ICQ   Вверх
borisbn
Дата 28.2.2010, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



ThisIsSparta, Имя __cdecl и __stdcall функций, объявленных в msvc как extern "C" отличаются только подчеркиванием в начале

jhonyxakep, очень не советую экспортировать из длл-ки stl-классы, т.к. они будут вылетать (и это в лучшем случае), если ты будешь использовать их в программе, откомпилированной другим компилятором или даже тем же компилятором, но с другой версией stl

Это сообщение отредактировал(а) borisbn - 28.2.2010, 06:51


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 2.3.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(jhonyxakep @ 28.2.2010,  02:45)
Цитата(ThisIsSparta @  28.2.2010,  01:25 Найти цитируемый пост)
_test@8

по моему это все таки линковка в стиле C++. 

Это С (__stdcall), а 8 - это размер аргументов на стеке. 
Цитата

А вот что дают названия функций в таком стиле?
Дает некоторую гарантию, что и вызывающая и вызываемая функция считают размер аргументов одинаковыми. Это важно, т.к. в стек их помещает вызывающая функция, а удаляет - вызываемая. И если они не договорятся о размере, то программа скорее всего сломается (вслед за стеком)  smile 

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


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

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



Цитата(xvr @  2.3.2010,  17:56 Найти цитируемый пост)
то программа скорее всего сломается (вслед за стеком)   

жесть...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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