#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);
Неявное подключение библиотеки
http://www.rsdn.ru/article/baseserv/dlluse.xml, и сделал, как там написано. Библиотеку писал сам, называется "MemManager.dll", там одна функция: __int64 Sum(__int64,__int64); Написал файл MemManager.h:
Пробовал добавлять lib файл в проект, тоже не помогло. Пишет что есть неразрешённые внешние элементы. Помогите!
С явным подключением проблем не было
Хотел неявно подключить к С++ библиотеку, написанную на асме. Прочитал статью
Код:
Пробовал добавлять lib файл в проект, тоже не помогло. Пишет что есть неразрешённые внешние элементы. Помогите!
С явным подключением проблем не было
Ну а символ MYDLL_EXPORTS в коде DLL определил?
Код:
.CODE
DllMain PROC
mov rax,1
ret
DllMain ENDP
Sum PROC
mov rax,rcx
add rax,rdx
ret
Sum ENDP
END
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:
Код:
//Функция 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;
}
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;
}
[COLOR="silver"]да,с символами я промахнулся малясь ☺[/COLOR]
Соглашения о вызовах тут не при чём, поскольку библиотека с явным вызовом корректно работала. Если бы дело было в этом, то я бы получал некорректный результат суммы. Я проверял.
Цитата: Виктор_Сен
Пишет что есть неразрешённые внешние элементы. Помогите!
в студию!
[COLOR="silver"]скорее всего extern "C"...[/COLOR]
"Пишет что есть неразрешённые внешние элементы. Помогите!" Это при неявном подключении библиотеки. А при явном, т. е. через LoadLibrary, всё работает.
Меня насторожила вот эта строчка: ?Sum@@YA_J_J0@Z, то есть, как я понял, компилятор в таком виде ищет функцию в dll. Тогда я перекомпилировал dll с таким корявым названием функции, и заработало. Только некрасиво получилось. И возникает вопрос: могу ли я заставить компилятор не кодировать имя функции?
Цитата:
могу ли я заставить компилятор не кодировать имя функции?
Да. Писать на С, а не на С++. :)
Попробуй
Цитата:
#if defined(__cplusplus)
extern "C" {
#endif
MYDLL_API __int64 Sum(__int64 a, __int64 b);
#if defined(__cplusplus)
}
#endif
extern "C" {
#endif
MYDLL_API __int64 Sum(__int64 a, __int64 b);
#if defined(__cplusplus)
}
#endif
Спасибо! Заработало!
Серьёзно? Круто. :) А я пальцем в небо ткнул. :)
Не помню где именно встречал(по моему в какой то статье про подключение длл и вызовы функций для С++, как раз в то время с ним тюкался) что можно настроить компилятор не декорировать функции и не ставить нижнее подчёркивание.
И точно не могу утверждать(в тему про С++ не очень глубоко погрузился), но по моему это как то лечится какими то .def файлами, что в них можно задать какое конкретно у функции будет имя.
Так же читал что борланд компилятор и майкрософт компилятор по разному декарируют функции, короче это парево ещё то.
Это ладно посмотрел всякими отладчиками как там она теперь называется, а если ты не на столько крут, где брать эти новые имена?
Можно с .def-файлом,можно и без него…Вообще,всё вполне себе можно настроить в настройках,а ещё в мысдыне есть статья,там 4 пункта на каждый вкус и цвет
Цитата: QWERYTY
Да, это декорирование имён функций в С++. Это было ещё одной каплей из всех прочих в переполненную чашу, из за чего я не стал переходить на С++, и остался на делфи.
Не помню где именно встречал(по моему в какой то статье про подключение длл и вызовы функций для С++, как раз в то время с ним тюкался) что можно настроить компилятор не декорировать функции и не ставить нижнее подчёркивание.
И точно не могу утверждать(в тему про С++ не очень глубоко погрузился), но по моему это как то лечится какими то .def файлами, что в них можно задать какое конкретно у функции будет имя.
Так же читал что борланд компилятор и майкрософт компилятор по разному декарируют функции, короче это парево ещё то.
Это ладно посмотрел всякими отладчиками как там она теперь называется, а если ты не на столько крут, где брать эти новые имена?
Не помню где именно встречал(по моему в какой то статье про подключение длл и вызовы функций для С++, как раз в то время с ним тюкался) что можно настроить компилятор не декорировать функции и не ставить нижнее подчёркивание.
И точно не могу утверждать(в тему про С++ не очень глубоко погрузился), но по моему это как то лечится какими то .def файлами, что в них можно задать какое конкретно у функции будет имя.
Так же читал что борланд компилятор и майкрософт компилятор по разному декарируют функции, короче это парево ещё то.
Это ладно посмотрел всякими отладчиками как там она теперь называется, а если ты не на столько крут, где брать эти новые имена?
А вообще я сейчас создаю свой язык программирования. Называется UCL (Universal Cybernetic Language). Сейчас разрабатываю его кибернетические принципы. Это к теме не относится, поэтому я углубляться не буду. Кому интересно, пишите в личку. Здесь напишу лишь только, что это совершенно новая парадигма программирования, и, хотя истоки берёт в ООП, но между UCL и ООП разница существенно больше, чем между структурным программированием и ООП.
Цитата: Виктор_Сен
А вообще я сейчас создаю свой язык программирования. Называется UCL (Universal Cybernetic Language). Сейчас разрабатываю его кибернетические принципы. Это к теме не относится, поэтому я углубляться не буду. Кому интересно, пишите в личку. Здесь напишу лишь только, что это совершенно новая парадигма программирования, и, хотя истоки берёт в ООП, но между UCL и ООП разница существенно больше, чем между структурным программированием и ООП.
Жду с нетерпением компилятор под BolgenOS.
А я ржу под столом...