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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алиас к имени функции, как сделать 
V
    Опции темы
marcusmae
Дата 2.11.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Привет, друзья,

кто знает, как задавать алиасы к именам функций?
Допустим, у меня есть dll, экспортирующая функцию :

Код

extern "C" __declspec(dllexport) int variedCaseNameFunc(...);


Эту dll нужно использовать в проекте на другом языке. Но некоторые компиляторы, например, Фортрана, умеют линковать только функции, именованые только строго UPPERCASE или строго lowercase, то есть описанная выше функция не прилинкуется. Можно, конечно, наплодить вызовов типа :

Код

extern "C" __declspec(dllexport) int variedсasenamefunc(...)
{ return variedCaseNameFunc(...); }


Код

extern "C" __declspec(dllexport) int VARIEDCASENAMEFUNC(...)
{ return variedCaseNameFunc(...); }


но как-то это диковато, правда?   smile

Это сообщение отредактировал(а) marcusmae - 2.11.2007, 22:40


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
MAKCim
Дата 2.11.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(marcusmae @  2.11.2007,  22:03 Найти цитируемый пост)
кто знает, есть ли в сях алиасы к именам функций?

нет
Цитата(marcusmae @  2.11.2007,  22:03 Найти цитируемый пост)
но как-то это диковато, правда?

другого выхода нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


stravaganza
**


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

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



Подумал, что это как-то делается, поскольку, как я понял, имя дающееся функции, это - фактически и есть алиас к Ordinal Value - функции в библиотеке нумеруются, и, видимо, возможно вызывать их прямо по этому номеру. Более того, некоторые функции иногда не имеют символьного имени, а только Ordinal Value!

Код

[DllImport("kernel32.dll"), EntryPoint="#708"]
public extern static void Sleep(uint msec);


Всё-таки, создание обёрток - это туча лишних джампов...

Цитата(MAKCim @  2.11.2007,  22:40 Найти цитируемый пост)
другого выхода нет


Жаль. Спасибо.

Это сообщение отредактировал(а) marcusmae - 2.11.2007, 22:51


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
MAKCim
Дата 2.11.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(marcusmae @  2.11.2007,  22:49 Найти цитируемый пост)
Подумал, что это как-то делается, поскольку, как я понял, имя дающееся функции, это - фактически и есть алиас к Ordinal Value - функции в библиотеке нумеруются, и, видимо, возможно вызывать их прямо по этому номеру. Более того, некоторые функции иногда не имеют символьного имени, а только Ordinal Value!

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


stravaganza
**


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

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



Цитата(MAKCim @  2.11.2007,  22:57 Найти цитируемый пост)
единственный вариант, вручную создать элементы таблицы символов (т. е псевдонимы для нужной функции, которые будут ссылаться на нужную функцию) и соответствующие им элементы таблицы строк (по сути названия символов, т. е сами псевдонимы)


Хмммм... Ну да. Как в этой старинной статье RSDN рассматривалась подобная проблема, только в применении к ведущим андерскорам :

Цитата

...функция-псевдоним попросту добавляется в таблицу экспорта dll: ее имя SumFunc добавляется в массив имен функций, а в массив порядковых номеров добавляется присвоенный ей порядковый номер. Однако соответствующий функции-псевдониму RVA в массиве относительных виртуальных адресов будет равен RVA функции с именем _SumFunc. Убедиться в этом можно последовательно вызывая GetProcAddress для имен функций SumFunc и _SumFunc и анализируя возвращаемый адрес (можно, разумеется, воспользоваться различными программами, позволяющими просмотреть содержимое исполняемого файла). В обоих случаях адрес функции будет одинаков.


Надо думать, две функции имеют 1) разные псевдонимы 2) разные номера Ordinal (!), но для обеих в таблице установлен одинаковый адрес смещения.

То есть, это действительно делается, но с использованием .def-файлов. Уже решение. А, может, можно без них? Помнится, производители компиляторов очень хвалились, что вот, def-файлы больше не нужны.


Это сообщение отредактировал(а) marcusmae - 2.11.2007, 23:29


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
dumb
Дата 3.11.2007, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



экспорты с редиректом/форвардом - не самые распространенные, и даже можно сказать - довольно экзотические случаи, посему затягивать их в синтаксис imho особого смысла не имеет. пользуй def'ы - наиболее простое и лаконичное решение.
PM MAIL   Вверх
archimed7592
Дата 3.11.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



marcusmae, бери пример с Микрософта: как они делают алиас GetWindowText на GetWindowTextA или GetWindowTextW? Макросами smile.
(шутка... так делать не нужно)


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
marcusmae
Дата 3.11.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата(archimed7592 @  3.11.2007,  10:15 Найти цитируемый пост)
marcusmae, бери пример с Микрософта: как они делают алиас GetWindowText на GetWindowTextA или GetWindowTextW? Макросами


Ооо, да!  smile

В общем, более-менее ясно, что делать. Спасибо за Ваши ответы smile 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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