Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2009, 01:05   #1
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию DLL

есть некая длл в ней пару функций

загружаю ее

Код:
HMODULE hMod=LoadLibraryW(L"mydll.dll");
пытаюсь достать оттудова функцию

Код:
typedef int (*pFunc)();
...

pFunc _pF;
_pF=(pFunc)::GetProcAddress(hMod,"MyFunc");
вот так не хочет работать, но если написать полное имя функции типа

?MyFunc@@YAPAV@@XZ , то все работает... Почему так? И что я забыл сделать, чтобы хватало краткой записи?
counter вне форума Ответить с цитированием
Старый 14.07.2009, 01:09   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Мне кажется у Вас чего то не хватает
Явное связывание dll с программой
psycho-coder вне форума Ответить с цитированием
Старый 14.07.2009, 02:29   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

наверно потому что именно полное имя функции и нужно указать
а не её отрывок
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2009, 11:09   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
Мне кажется у Вас чего то не хватает
Явное связывание dll с программой
да вроде всего хватает, модуль подкючает, а функцию в нем не находит...


Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
наверно потому что именно полное имя функции и нужно указать
а не её отрывок
ну привет, я что должен постоянно спрашивать у линкера как он мою функцию обзывает при линковке?
counter вне форума Ответить с цитированием
Старый 14.07.2009, 11:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
?MyFunc@@YAPAV@@XZ
Я часто в отладчике сталкивался с такими именами, но до сих пор не пойму почему такие названия получаются...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 12:08   #6
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

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

Про пример : а как вы экспортируете? так:

Код:
extern "C" __declspec(dllexport ) int MyFunc(long parm1);
хм, щас посмотрел - если так объявлять, имена не манглятся, но и перегрузить такую функцию нельзя (как пишет VS - "old-style", в Си ведь нет перегрузок)

Последний раз редактировалось BaronTreep; 14.07.2009 в 12:11.
BaronTreep вне форума Ответить с цитированием
Старый 14.07.2009, 12:13   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

?MyFunc@@YAPAV@@XZ для этого пользуемся декодированием имен.

extern "C" ____stdcall __declspec(dllexport ) int MyFunc(); -вот так все должно работать.

Цитата:
Я часто в отладчике сталкивался с такими именами, но до сих пор не пойму почему такие названия получаются...
Каждый компилятор желает в имени функции оставить, что-то свое, например среда VC оставляет "@" Borland C++ впереди функции пишет два знака подчеркивания __func() и т.д. Что бы предотвратить это используют некия соглашения, что-бы имена функция при импортировании были "чистыми".

Последний раз редактировалось profi; 14.07.2009 в 12:18.
profi вне форума Ответить с цитированием
Старый 14.07.2009, 12:35   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
profi
А чего я за Делфи такое не замечал?

ТОлько что создал простенький проект:
Код:
//---------------------------------------------------------------------------

#include <windows.h>

#pragma argsused
 #define DLLEXPORT extern "C" __declspec(dllexport)
 DLLEXPORT double AddNumbers(double a, double b);

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
	return 1;
}

DLLEXPORT double AddNumbers(double a, double b)
 {
   return a + b;
 }
//---------------------------------------------------------------------------
Имя в ДЛЛ с подчерком, но без всяких приколов.
I'm learning to live...

Последний раз редактировалось Stilet; 14.07.2009 в 12:43.
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 12:38   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

MyFunc@@YAPAV@@XZ указывает на тип и количество передаваемых параметров, в сишных библиотеках такое, но обычно это имена функций для "внутреннего" использования, вот и получается ужас типа
soap_delete_std__string@@YAXPAUsoap @@PAV?$basic_string@DU?$char_traits @D@std@@V?$allocator@D@2@@std@@@Z
пыщь
JTG вне форума Ответить с цитированием
Старый 14.07.2009, 12:40   #10
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

А в Делфи с этим все в порядке, разработчики позаботились за имена функций. Советую всем вот эту статью.

Последний раз редактировалось profi; 14.07.2009 в 12:49.
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dll sergei64_89 Общие вопросы .NET 1 02.08.2008 19:52
DLL MusicMan Помощь студентам 3 21.04.2008 21:30
DLL michaellos Win Api 1 16.11.2007 21:03
.DLL ZhekON Общие вопросы Delphi 3 20.05.2007 21:02
DLL Shico Win Api 1 16.04.2007 16:24