Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Алиас к имени функции


Автор: marcusmae 2.11.2007, 22:03
Привет, друзья,

кто знает, как задавать алиасы к именам функций?
Допустим, у меня есть 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

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

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

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

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

Код

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


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

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


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

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

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

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


Хмммм... Ну да. Как в http://rsdn.ru/article/devtools/bcbdll.xml старинной статье RSDN рассматривалась подобная проблема, только в применении к ведущим андерскорам :

Цитата

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


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

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

Автор: dumb 3.11.2007, 06:35
экспорты с редиректом/форвардом - не самые распространенные, и даже можно сказать - довольно экзотические случаи, посему затягивать их в синтаксис imho особого смысла не имеет. пользуй def'ы - наиболее простое и лаконичное решение.

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

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


Ооо, да!  smile

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)