Сейчас на форуме: zds, UniSoft (+6 невидимых)

 eXeL@B —› Программирование —› Экспорт декорированных имён
Посл.ответ Сообщение

Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 06 октября 2012 10:07
· Личное сообщение · #1

Обычно задают вопрос, как в своей dll избавиться от экспорта вида ??0__non_rtti_object@std@@QAE@ABV01@@Z

У меня же обратная задача - пишу вроппер для dll, в ней порядка двух сотен функций, прототипы которых я и не знаю, поэтому делаю DEF-файл со списком оригинальных функций, а в программе делаю стаб вида:
Code:
  1. extern "C" __declspec(naked) void __stdcall __E__X__()
  2. {
  3.     __asm
  4.     {
  5.         jmp p[X*4];
  6.     }
  7. }

Всё ничего, но в экпорте есть пара функций вида _Func1@0 и _Func2@4, если в DEF-файле указать
Code:
  1. _Func1@0 = __E__1__
  2. _Func2@4 = __E__2__

то в экспорт попадает имя только до @

Вопрос: как добиться, чтобы в экспорт ф-и попадали в декорированном (_Func1@0) виде?




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 06 октября 2012 10:48 · Поправил: plutos
· Личное сообщение · #2

http://msdn.microsoft.com/en-us/library/d91k01sh.aspx:

The EXPORTS statement lists the names and, optionally, the ordinal values of the functions exported by the DLL. You assign the function an ordinal value by following the function's name with an at sign (@) and a number. When you specify ordinal values, they must be in the range 1 through N, where N is the number of functions exported by the DLL.
For example, a DLL that contains the code to implement a binary search tree might look like the following:

LIBRARY BTREE
EXPORTS
Insert @1
Delete @2
Member @3
Min @4

Т.е. может там нужно просто space перед @? Если речь идет об ординалах, конечно же.

-----
Give me a HANDLE and I will move the Earth.




Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 06 октября 2012 10:58 · Поправил: GroundHog
· Личное сообщение · #3

plutos пишет:
Т.е. может там нужно просто space перед @? Если речь идет об ординалах, конечно же.

Дело не в ординалах, а в декорированных именах. Если самому объявлять имена ф-й с @ в имени, то они обрезаются ровно по собачке.

Пока проблему решил, заменив @ на другой символ и навесив на Post Build Events патч бинарника утилитой, но как это не айс.



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 06 октября 2012 12:46 · Поправил: HiEndsoft
· Личное сообщение · #4

Я так делаю:

def-файл:
Code:
  1. LIBRARY MY_LIB.DLL 
  2. EXPORTS _MyFunc=MyFunc @2

c-файл:
Code:
  1. DWORD __declspec(dllexport) __stdcall MyFunc(IN char* szInParam, OUT char* szOutParam)
  2. {...
  3. }

В итоге в экспорте имею одну и ту же функцию задекрорированную и нет, типа так:
Code:
  1. [Ordinal: 2] _MyFunc 
  2. [Ordinal: 3] ?MyFunc@@YGKPAD0@Z


-----
продавец резиновых утёнков



 eXeL@B —› Программирование —› Экспорт декорированных имён
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати