Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Неявное подключение библиотеки

67K
23 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
Хотел неявно подключить к С++ библиотеку, написанную на асме. Прочитал статью http://www.rsdn.ru/article/baseserv/dlluse.xml, и сделал, как там написано. Библиотеку писал сам, называется "MemManager.dll", там одна функция: __int64 Sum(__int64,__int64); Написал файл MemManager.h:
 
Код:
#pragma comment(lib,"MemManager.lib")

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

MYDLL_API __int64 Sum(__int64 a, __int64 b);

Пробовал добавлять lib файл в проект, тоже не помогло. Пишет что есть неразрешённые внешние элементы. Помогите!

С явным подключением проблем не было
7
23 октября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ну а символ MYDLL_EXPORTS в коде DLL определил?
67K
23 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
Вот MemManager.dll:
Код:
.CODE

DllMain PROC
    mov rax,1
    ret
DllMain ENDP

Sum PROC
    mov rax,rcx
    add rax,rdx
    ret
Sum ENDP

END

Вот как я её компилировал:
ml64 MemManager.asm /link /OUT:"MemManager.dll" /DLL /entry:DllMain /DEF:MemManager.def /SUBSYSTEM:CONSOLE
Вот MemManager.def:
LIBRARY MemManager
EXPORTS Sum @1
Вот я проверял експортированные функции dll:
67K
23 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
Ну и с явным вызовом проблем не было:
Код:
//Функция Sum будет иметь 2 целочисленных, возвращать она будет целое число
typedef __int64 (*pSum)(__int64, __int64);

int _tmain(int argc, _TCHAR* argv[])
{
    //Переменные для суммы
    __int64 a, b, r = 0;

    //Адрес DLL-модуля
    HMODULE hModule;
    //Адрес фунцкии вычисления адреса
    pSum Sum;

    //Загрузка DLL в адресное пространство процесса
    hModule = LoadLibraryA("MemManager.dll");
    //Получения адреса функции с именем Sum
    Sum = (pSum)GetProcAddress(hModule, "Sum");
       
    cout << "A = ";
    cin >> a;  
    cout << "B = ";
    cin >> b;  

    //Вычислени суммы
    r = Sum(a, b);

    cout << "Result = " << r << endl;

    //Выгрузка DLL
    FreeLibrary(hModule);

    _getch();

    return 0;
}
7
23 октября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ага-ага.Ну тут дело,стало быть,в соглашениях о вызовах,как минимум
[COLOR="silver"]да,с символами я промахнулся малясь ☺[/COLOR]
67K
23 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
Соглашения о вызовах тут не при чём, поскольку библиотека с явным вызовом корректно работала. Если бы дело было в этом, то я бы получал некорректный результат суммы. Я проверял.
14
24 октября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: Виктор_Сен

Пишет что есть неразрешённые внешние элементы. Помогите!



в студию!
[COLOR="silver"]скорее всего extern "C"...[/COLOR]

67K
24 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
"Пишет что есть неразрешённые внешние элементы. Помогите!" Это при неявном подключении библиотеки. А при явном, т. е. через LoadLibrary, всё работает.
67K
24 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) __int64 __cdecl Sum(__int64,__int64)" (__imp_?Sum@@YA_J_J0@Z) в функции wmain D:\doc\dev\Visual Studio 2010\TestDLL\TestDLL\TestDLL.obj TestDLL

Меня насторожила вот эта строчка: ?Sum@@YA_J_J0@Z, то есть, как я понял, компилятор в таком виде ищет функцию в dll. Тогда я перекомпилировал dll с таким корявым названием функции, и заработало. Только некрасиво получилось. И возникает вопрос: могу ли я заставить компилятор не кодировать имя функции?
316
24 октября 2011 года
Alm3n
889 / / 29.05.2009
Цитата:
могу ли я заставить компилятор не кодировать имя функции?


Да. Писать на С, а не на С++. :)
Попробуй

Цитата:
#if defined(__cplusplus)
extern "C" {
#endif

MYDLL_API __int64 Sum(__int64 a, __int64 b);

#if defined(__cplusplus)
}
#endif

67K
24 октября 2011 года
Виктор_Сен
22 / / 21.10.2011
Спасибо! Заработало!
316
24 октября 2011 года
Alm3n
889 / / 29.05.2009
Серьёзно? Круто. :) А я пальцем в небо ткнул. :)
465
12 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Да, это декорирование имён функций в С++. Это было ещё одной каплей из всех прочих в переполненную чашу, из за чего я не стал переходить на С++, и остался на делфи.

Не помню где именно встречал(по моему в какой то статье про подключение длл и вызовы функций для С++, как раз в то время с ним тюкался) что можно настроить компилятор не декорировать функции и не ставить нижнее подчёркивание.
И точно не могу утверждать(в тему про С++ не очень глубоко погрузился), но по моему это как то лечится какими то .def файлами, что в них можно задать какое конкретно у функции будет имя.
Так же читал что борланд компилятор и майкрософт компилятор по разному декарируют функции, короче это парево ещё то.
Это ладно посмотрел всякими отладчиками как там она теперь называется, а если ты не на столько крут, где брать эти новые имена?
7
12 апреля 2012 года
@pixo $oft
3.4K / / 20.09.2006
Можно с .def-файлом,можно и без него…Вообще,всё вполне себе можно настроить в настройках,а ещё в мысдыне есть статья,там 4 пункта на каждый вкус и цвет
67K
14 мая 2012 года
Виктор_Сен
22 / / 21.10.2011
Цитата: QWERYTY
Да, это декорирование имён функций в С++. Это было ещё одной каплей из всех прочих в переполненную чашу, из за чего я не стал переходить на С++, и остался на делфи.

Не помню где именно встречал(по моему в какой то статье про подключение длл и вызовы функций для С++, как раз в то время с ним тюкался) что можно настроить компилятор не декорировать функции и не ставить нижнее подчёркивание.
И точно не могу утверждать(в тему про С++ не очень глубоко погрузился), но по моему это как то лечится какими то .def файлами, что в них можно задать какое конкретно у функции будет имя.
Так же читал что борланд компилятор и майкрософт компилятор по разному декарируют функции, короче это парево ещё то.
Это ладно посмотрел всякими отладчиками как там она теперь называется, а если ты не на столько крут, где брать эти новые имена?



А вообще я сейчас создаю свой язык программирования. Называется UCL (Universal Cybernetic Language). Сейчас разрабатываю его кибернетические принципы. Это к теме не относится, поэтому я углубляться не буду. Кому интересно, пишите в личку. Здесь напишу лишь только, что это совершенно новая парадигма программирования, и, хотя истоки берёт в ООП, но между UCL и ООП разница существенно больше, чем между структурным программированием и ООП.

277
14 мая 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Виктор_Сен
А вообще я сейчас создаю свой язык программирования. Называется UCL (Universal Cybernetic Language). Сейчас разрабатываю его кибернетические принципы. Это к теме не относится, поэтому я углубляться не буду. Кому интересно, пишите в личку. Здесь напишу лишь только, что это совершенно новая парадигма программирования, и, хотя истоки берёт в ООП, но между UCL и ООП разница существенно больше, чем между структурным программированием и ООП.



Жду с нетерпением компилятор под BolgenOS.

67K
15 мая 2012 года
Виктор_Сен
22 / / 21.10.2011
А я ржу под столом...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог