Импорт класса

Тема в разделе "LANGS.C", создана пользователем GoldFinch, 1 ноя 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Есть длл (не моя), в ней 3 функции
    1) ??0FCanvasUtil@@QAE@PAVFRenderTarget@@PAVFRenderInterface@@@Z
    public: __thiscall FCanvasUtil::FCanvasUtil(class FRenderTarget *, class FRenderInterface *)
    2) ?DrawLine@FCanvasUtil@@QAEXMMMMVFColor@@H@Z
    public: void __thiscall FCanvasUtil::lol: rawLine(float, float, float, float, class FColor, int)
    3) ??1FCanvasUtil@@UAE@XZ
    public: virtual __thiscall FCanvasUtil::~FCanvasUtil(void)

    Какие параметры им передавать и где их взять я знаю. Хочу написать прогу на ЯВУ типа Си, чтобы эти функции вызывать. Это реально?
     
  2. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    GoldFinch
    Класс надо также объявить внешним, компилер взять такой же, и в теории можно уже и вызывать.
     
  3. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    судя по "FCanvasUtil(class FRenderTarget *, class FRenderInterface *)" итп - Си не хватит. А если С++, то надо делать как сказал Osen.

    з.ы. у Агнера Фогу была статейка, где описывались манглинг имен разными компиляторами, думаю тебе пригодится. Сайт вроде http://agner.org/
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    важно правильно передать параметры (включая this если он ипользуется). Очень гибок тут ватком (#pragma aux ...), кроме того, ватком линкер позволяет задавать алиасы имен в объектниках.
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    GoldFinch
    ну и вчем трабла ? Указатель на класс создал и какой нить в длл одну экспортируемую GetClassPtr и в клиентском коде импортируй и вызывай. результат в переменную-указатель на этот класс и дергай себе на здоровье.

    Пример мыслей, на псевдо-коде:

    Код (Text):
    1. // декларация
    2. class MyClass
    3. {
    4. /// дохера всего
    5. };
    6.  
    7. MyClass mycl; // глобальная
    8.  
    9. MyClass * GetClassPtr()
    10. {
    11.   return(&mycl);
    12. }
    13.  
    14. клиентский код:
    15. // декларация
    16. class MyClass
    17. {
    18. /// дохера всего
    19. };
    20.  
    21. MyClass * mycl; // глобальная
    22.  
    23. mycl = GetClassPtr();
    24.  
    25. mycl.SuperFunc();
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    EvilsInterrupt
    ничего что длл не моя?
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    1) GetProcAddress
    2) def файл с псевдонимами.
    3) Править таблицу экспорта.

    Очень желательно иметь заголовок класса, так как в начале идёт выделение памяти, а затем вызов конструктора из dll. Хотя можно и наугад конечно выделять. :)

    GoldFinch
    Это откуда? Canvas :)

    EvilsInterrupt
    Чтобы это сработало нужно объявить все функции виртуальными или иметь реализацию класса.
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    С импортом разобрался, надо было объявить соответствующий класс согласно деманглингу, т.е.
    Код (Text):
    1. #pragma comment(lib,"engine.lib")
    2. class FCanvasUtil {
    3. public: FCanvasUtil(class FRenderTarget *, class FRenderInterface *);
    4. public: void DrawLine(float a0, float a1, float a2, float a3, class FColor, int a5);
    5. public: virtual ~FCanvasUtil(void);
    6. };
    7. class FColor {};
    8. class FRenderTarget {};
    9. class FRenderInterface {};
    Всем спасибо.