На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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 Кбайт, скачиваний: 1134)
        ссылка не работает.
          Столкнулся я с 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 Кбайт, скачиваний: 1147)
            Цитата Uhri @
            Столкнулся я с TBitmap и выяснил, что TBitmap->Canvas->Pixels[][] работает неимоверно медленно... Нашел параметр TBitmap::ScanLine[] - работает очень быстро, но не всегда удобно разбираться где там Red, Green, Blue и собирать это всё в пиксел и т.п. Поэтому сделал свой класс: обертку над TBitmap.

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

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

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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0407 ]   [ 16 queries used ]   [ Generated: 17.06.24, 03:15 GMT ]