Проблема с DLL-кой

Тема в разделе "WASM.WIN32", создана пользователем S_Alex, 7 май 2008.

  1. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Необходимо выполнить экспорт некой функции
    ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z

    В def файле пишу

    LIBRARY MyLib.dll
    EXPORTS
    ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z = MyFunc

    а экспортируется только часть, до первой "собаки"

    ?DisplayFullExternal

    Каким образом можно выполнить экспорт такой функции?

    Методом через Ж.. мне удалось, но пришлось править имена вручную.
    А можно как-нибудь по простому?
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Сделайте С-кальный или Стд-кальный переходник.
    Наверно не стоит править С++ имена в другую конвенцию вручную. Можно получить загадочных ошибок много.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_Alex
    Если хочешь, чтобы работал
    Код (Text):
    1. pfn = GetProcAddress(hMyLib, "MyFunc");
    то надо писать наоборот
    Код (Text):
    1. LIBRARY MyLib.dll
    2. EXPORTS
    3. MyFunc = ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Можно ещё вручную поправить имя экспортируемой функции после сборки. Или написать простенькую тулзу, которая будет это делать сама (и запихнуть её в Post-build step).
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_Alex
    Или надо чтобы работал
    Код (Text):
    1. pfn = GetProcAddress(hMyLib, "?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z");
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Решается в 3 строчки с использованием ImpLib:

    Код (Text):
    1. include '..\implib.inc'
    2. implib MyLib.dll, MyFunc, ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z
    3. endlib
    Компилируем в .lib, дизасмим:

    Код (Text):
    1. .text:00000000 ; public: virtual bool __thiscall CF878AVideoDisplayer::DisplayFullExternal(unsigned long, unsigned long)
    2. .text:00000000                 public ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z
    3. .text:00000000 ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z proc near
    4. .text:00000000                 jmp     __imp__MyFunc
    5. .text:00000000 ?DisplayFullExternal@CF878AVideoDisplayer@@UAE_NKK@Z endp
    Цепляю тестовый либ-файл.
     
  7. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    все функции можно в линкере отманглить, в ms vc++
    пишешь в опции /EXPORT:FUNC1 /EXPORT:FUNC2 и т.д.