На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (7) « Первая ... 4 5 [6] 7  все  ( Перейти к последнему сообщению )  
> Чего не хватает в FAQ?, Чего изволите? :)
    Частенько на форуме подымается вопрос: "Как импортировать свой класс из DLL?".

    Решений на самом деле множество, вот несколько известных мне:

    1. статическая привязка lib файла к ехе и хедера класса:

    недостаток, нет динамики, мы не используем функцию LoadLibrary, и соответственно не управляем процессом загрузки библиотеки, компилятор это все за нас встраивает в наше приложение и в случае отсутствия dll приложение просто выдает сообщение об отсутствии dll и не запускается. А если нам это нужно было. Ну например для того, чтобы у одного клиента функциональность программы была больше, а другого меньше (денег меньше заплатил :) );

    2. динамическая привязка, с загрузкой методов класса вручную:

    ExpandedWrap disabled
      //есть некий класс CLS, в DLL он реализовывается обычным способом, только добавляем _export в объявлении класса, т.е.
      class _export CLS
      {
      public:
          void PutValue(int Index, int Value);
      };
      //в ЕХЕ всё иначе обстоит, вот пример объявления класса
      typedef void (__import * FPutValue(int Index, int Value));
      class CLS
      {
      public:
          FPutValue * PutValue;
      };
      //а теперь когда мы загрузили либу получаем нашу функцию и присваиваем методу класса
      cls->PutValue = (FPutValue *)GetProcAddress(dll, "@testcls@PutValue$qii");
      //далее используем как и где нам надо, имхо не забывайте про проверку
      if(cls->PutValue)
      {
      }


    Недостаток я думаю очевиден, слишком много мороки при написании этого. Можно ли упростить импорт класса? Можно, см. пункт 3.

    3. Динамическая привязка DLL с использованием виртуального класса, полиморфизм нас спасёт :)
    Идея очень простая:
    - создаем базовый чисто виртуальный класс;
    В DLL
    - создаем класс, который наследует наш виртуальный базовый класс, и реализуем все его методы;
    - создаем две экспортируемые функции: первая создает наш класс и возвращает указатель на базовый, вторая уничтожает наш класс.
    В ЕХЕ
    - загружаем библиотеку
    - импортируем наши две функции из библиотеки
    - создаем класс первой функцией и работаем с ним
    - уничтожаем класс второй функцией

    В аттаче к сообщению полный пример реализации 3 способа.

    PS: закорлючки вида "@testcls@PutValue$qii" можно узнать при помощи утилиты impdef.exe которая находится в папке bin Builder-a.
    PPS: удачи
    Прикреплённый файлПрикреплённый файлDBTEST.zip (70.77 Кбайт, скачиваний: 194)
    Попытки заставить человека вести себя более удобным для машины образом часто (и справедливо) рассматриваются как оскорбительные... (Bjarne Stroustrup)
      Во имя Ctrl, Alt и святаго Del, Enter!

      Основам программирования не обучаю. Не интересно.
        ссылка не работает.
          Столкнулся я с TBitmap и выяснил, что TBitmap->Canvas->Pixels[][] работает неимоверно медленно... Нашел параметр TBitmap::ScanLine[] - работает очень быстро, но не всегда удобно разбираться где там Red, Green, Blue и собирать это всё в пиксел и т.п. Поэтому сделал свой класс: обертку над TBitmap.
          Эксперимент, например нам нужно картинку из цветной сделать черно-белой, размеры картинки 2816x2112:
          ExpandedWrap disabled
                //Graphics::TBitmap * bmp;
             
                for(int w=0; w<bmp->Width; w++)
                    for(int h=0; h<bmp->Height; h++)
                    {
                        TColor cl = bmp->Canvas->Pixels[w][h];
                        BYTE val = BYTE(U_BLUE_KOEF * GetBValue(cl) + U_GREEN_KOEF * GetGValue(cl) + U_RED_KOEF * GetRValue(cl));
                        cl = TColor(RGB(val,val,val));
                        bmp->Canvas->Pixels[w][h] = cl;
                    }

          Результат мы получим примерно за 20 секунд (Pentium 3.06 GHz, 512 Mb ОЗУ)
          С моим классом оберкой:
          ExpandedWrap disabled
                //UBitmap * bmp;
                for(int w=0; w<bmp->Width; w++)
                    for(int h=0; h<bmp->Height; h++)
                    {
                        BYTE val = BYTE(U_BLUE_KOEF * bmp->B[w][h] + U_GREEN_KOEF * bmp->G[w][h] + U_RED_KOEF * bmp->R[w][h]);
                        bmp->Pixels[w][h] = TColor(RGB(val, val, val));
                    }

          Результат мы получим примерно через 3 сек.

          PS: класс-обертка в аттаче.

          PPS: а если использовать ScanLine[] и напрямую работать с данными, то скорость увеличится еще в несколько раз.
          Прикреплённый файлПрикреплённый файлUBitmap.zip (0.95 Кбайт, скачиваний: 191)
          Попытки заставить человека вести себя более удобным для машины образом часто (и справедливо) рассматриваются как оскорбительные... (Bjarne Stroustrup)
            Цитата Uhri @
            Столкнулся я с TBitmap и выяснил, что TBitmap->Canvas->Pixels[][] работает неимоверно медленно... Нашел параметр TBitmap::ScanLine[] - работает очень быстро, но не всегда удобно разбираться где там Red, Green, Blue и собирать это всё в пиксел и т.п. Поэтому сделал свой класс: обертку над TBitmap.

            :wacko:
            Вы видимо ничего не слышали о TRGBTriple, TRGBQuad.
            Зачем велосипед изобретать?
              Chow, в принципе, если надо выбирать между экзотикой (а надо ещё и знать, что таковая существует) и чем-то самодельным, понятным и позволяющим решить поставленную задачу, я всегда выбираю второе.
                Цитата Bladerunner @
                Chow, в принципе, если надо выбирать между экзотикой (а надо ещё и знать, что таковая существует) и чем-то самодельным, понятным и позволяющим решить поставленную задачу, я всегда выбираю второе.

                А к чему это?? Просто так, что-бы что-то сказать?
                  Chow думаю Bladerunner прав, ибо про всё знать не возможно. Тебе спасибо, что проинформировал, надо будет посмотреть.
                  Попытки заставить человека вести себя более удобным для машины образом часто (и справедливо) рассматриваются как оскорбительные... (Bjarne Stroustrup)
                    Chow, задаю тебе тот же самый вопрос :whistle:
                      Цитата Bladerunner @
                      Chow, задаю тебе тот же самый вопро

                      Не вижу вопроса. (по крайней мере вопросительного знака)
                        Думаю неплохо было бы сделать тут что-то типа библиотечки (хранилища) где можно хранить готовые, отлаженные функции. Ведь по прошествию времени вопросы повторяются (получить IP адрес, поиск строки в файле, сортировка массивов.....). А так всем удобно, и по несколько раз на один и тот же вопрос отвечать не надо, и кому что надо предварительно там поищет не задавая лишних вопросов.
                        лучше переесть, чем недоспать
                          Цитата sten_11 @
                          Думаю неплохо было бы сделать тут что-то типа библиотечки (хранилища) где можно хранить готовые, отлаженные функции. Ведь по прошествию времени вопросы повторяются (получить IP адрес, поиск строки в файле, сортировка массивов.....). А так всем удобно, и по несколько раз на один и тот же вопрос отвечать не надо, и кому что надо предварительно там поищет не задавая лишних вопросов.
                          Ну так это просто дублирование FAQ.
                            Цитата sten_11
                            ... и кому что надо предварительно там поищет не задавая лишних вопросов...
                            Тока почему-то народ сначала вопросы задает, и только после того как его "пошлют" смотрит FAQ.
                            Попытки заставить человека вести себя более удобным для машины образом часто (и справедливо) рассматриваются как оскорбительные... (Bjarne Stroustrup)
                              В FAQ не хватает информации, как сделать цвет фона формы прозрачым.
                              (Похожий на стил Vista)
                              Сообщение отредактировано: Maycal -
                                Было бы хорошо, если бы в FAQ был еще help по DSPACK. Уже который день роюсь в нете, более или менее приличные примеры нашел тока на Delphi...(ито, ввиду того, что эти примеры находятся в самом DSPACK).
                                Сообщение отредактировано: seska -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1371 ]   [ 18 queries used ]   [ Generated: 21.08.18, 19:28 GMT ]