На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Юзание объектов длл , динамически
    ExpandedWrap disabled
      #ifndef __StatApp_H
      #define __StatApp_H
       
      #ifdef __cplusplus
      extern "C"{
      #endif
       
      __declspec( dllexport ) class Stat1{
        public:
          void QuickSort( int, int, double * );
      };
       
      extern const Stat1 Stat1App;
       
      #ifdef __cplusplus
      }
      #endif
       
      #endif


    есть вот такая конструкция, как видно есть объект Stat1App. Как можно обратиться из программы к функции QuickSort этого объекта. И еще лучше ли построить такую конструкцию


    ExpandedWrap disabled
      #ifndef __StatApp_H
      #define __StatApp_H
       
      #ifdef __cplusplus
      extern "C"{
      #endif
       
      namespace Stat1{
        __declspec( dllexport ) void QuickSort( int, int, double * );
      }
      #ifdef __cplusplus
      }
      #endif
       
      #endif


    тоесть заменить обращение через объект на namesapce. Хотелось бы узнать стоит ли, возможно ли ?

    Цеплятся конечно же динамически, изать либ получается без проблем. Доступ к функциям тоже, а вот через объект не могу догнать как !?

    Добавлено в :
    я тут потихоньку решаю свою проблему, забыл дописать
    __declspec( dllexport ) к extern const Stat1 Stat1App;

    теперь имею
    _Stat1App @4; _Stat1App
    в экспорте

    но что получать в
    GetProcAddress( hlib, "_Stat1App" ); ??

    я же не хочу хедер использовать, а потому не знаю класса ??
      Метод объекта отличается от обычной функции только тем, что неявно и первым параметром в него передается указатель на объект:

      C++:
      ExpandedWrap disabled
        void MyClass::DoIt(int a, int b)


      на C выглядит так:
      ExpandedWrap disabled
        void DoIt(struct MyClass *_this, int a, int b)


      Трабл в том, что метод будет иметь декорированное имя ?DoIt@MyClass@@QAEXHH@Z (MSVC 6)
      Сообщение отредактировано: Visitor -
        Я знал что гуру ДЛЛ Visitor что то ответит :)

        С получением метода класса я проблем не вижу, понятно к чему надо кастануть

        void ( MyClass::*OnDoIt )( int, int, double *);

        OnDoIt fptr = (OnDoIt)GetProcAddress( hlib, "?DoIt@MyClass@@QAEXHH..." );

        Но уже при такой записи возникает непонятки, что за MyClass ? хедера ведь нет.

        для функции можно это обойти предобъявлением типа class MyClass;
        во всяком случае линкер ругатся не будет (?) Но ведь нужно вызвать эту функцию!
        Тут похоже без хедера ни куда, где будет класс описан ?

        А как с моим примером ? там переменная - объект класса, надобы указатель на не вытащить
        Stat1 *pStat = &((Stat)GetProcAddress( hlib, "_Stat1App" )); ?? как такое замутить ?
          Ну тут уже при помощи зравого смысла и какой-то ма текущих потребностей :)

          Можно в длл сделать функцию, которая конструирует объект и возвращает указатель на него (или просто возвращает указатель на глобальный объект), например.
          Сообщение отредактировано: Visitor -
            Цитата
            Visitor, 5.02.04, 07:45
            Можно в длл сделать функцию, которая конструирует объект и возвращает указатель на него (или просто возвращает указатель на глобальный объект), например.


            Простите, на что ? void * ?
            Я просто понимаю, что нехватеает какой то фундаментальной ступеньки в знаниях, хочу ликвидировать это.

            Если нет недера а только длл, в которой не только функции а объектная структура, могу ли я работать с объектами или это по определению не возможно ? так как нет объявлений этих структур ?
              ExpandedWrap disabled
                 
                class CObj
                {
                  public:
                    void Metod()
                    {
                      //----------  
                    }
                }
                 
                 
                 
                //экспорт
                extern "C" __declspec(dllexport) void NewObj(void** handle)
                 {
                      *handle=new CObj;
                 }
                 
                 
                #define OPOINT CObj *op;op=(CObj*)handle;
                 
                 
                extern "C" __declspec(dllexport)  void FreeObj(void* handle)
                 {
                      OPOINT
                      delete op;
                 }
                 
                extern "C" __declspec(dllexport)  void Metod(void* handle)
                 {
                      OPOINT
                      op->Metod();
                 }
                 
                 
                 
                //юзанье
                 
                void* p;
                 
                NewObj(&p);//создание
                 
                Metod(p);//использование
                 
                FreeObj(p);//..удаление


              если стандартная длл - то тока так.
              иначе - только через MFC расширения dll или COM или .NET
                неплохой подход. Но работа с таким объектом очень опасная будет. Да и неудобная. В добавок для каждого метода надо еще обертку писать - жуть.

                Но за решение моего вопроса спасибо, ++;
                  Мне кажется что LoadLibrali с лёгкостью загрузит функцию по её декодированому имени осталось лишь привести её к указателю на функцию класса
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0695 ]   [ 16 queries used ]   [ Generated: 1.05.24, 00:29 GMT ]