Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Страницы: (7) « Первая ... 4 5 [6] 7 все ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
Частенько на форуме подымается вопрос: "Как импортировать свой класс из DLL?".
Решений на самом деле множество, вот несколько известных мне: 1. статическая привязка lib файла к ехе и хедера класса: недостаток, нет динамики, мы не используем функцию LoadLibrary, и соответственно не управляем процессом загрузки библиотеки, компилятор это все за нас встраивает в наше приложение и в случае отсутствия dll приложение просто выдает сообщение об отсутствии dll и не запускается. А если нам это нужно было. Ну например для того, чтобы у одного клиента функциональность программы была больше, а другого меньше (денег меньше заплатил ); 2. динамическая привязка, с загрузкой методов класса вручную: //есть некий класс 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 Кбайт, скачиваний: 1146) |
Сообщ.
#79
,
|
|
|
Столкнулся я с TBitmap и выяснил, что TBitmap->Canvas->Pixels[][] работает неимоверно медленно... Нашел параметр TBitmap::ScanLine[] - работает очень быстро, но не всегда удобно разбираться где там Red, Green, Blue и собирать это всё в пиксел и т.п. Поэтому сделал свой класс: обертку над TBitmap.
Эксперимент, например нам нужно картинку из цветной сделать черно-белой, размеры картинки 2816x2112: //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 ОЗУ) С моим классом оберкой: //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 Кбайт, скачиваний: 1159) |
Сообщ.
#80
,
|
|
|
Цитата Uhri @ Столкнулся я с TBitmap и выяснил, что TBitmap->Canvas->Pixels[][] работает неимоверно медленно... Нашел параметр TBitmap::ScanLine[] - работает очень быстро, но не всегда удобно разбираться где там Red, Green, Blue и собирать это всё в пиксел и т.п. Поэтому сделал свой класс: обертку над TBitmap. Вы видимо ничего не слышали о TRGBTriple, TRGBQuad. Зачем велосипед изобретать? |
Сообщ.
#81
,
|
|
|
Chow, в принципе, если надо выбирать между экзотикой (а надо ещё и знать, что таковая существует) и чем-то самодельным, понятным и позволяющим решить поставленную задачу, я всегда выбираю второе.
|
Сообщ.
#82
,
|
|
|
Цитата Bladerunner @ Chow, в принципе, если надо выбирать между экзотикой (а надо ещё и знать, что таковая существует) и чем-то самодельным, понятным и позволяющим решить поставленную задачу, я всегда выбираю второе. А к чему это?? Просто так, что-бы что-то сказать? |
Сообщ.
#83
,
|
|
|
Chow думаю Bladerunner прав, ибо про всё знать не возможно. Тебе спасибо, что проинформировал, надо будет посмотреть.
|
Сообщ.
#84
,
|
|
|
Chow, задаю тебе тот же самый вопрос
|
Сообщ.
#85
,
|
|
|
Цитата Bladerunner @ Chow, задаю тебе тот же самый вопро Не вижу вопроса. (по крайней мере вопросительного знака) |
Сообщ.
#86
,
|
|
|
Думаю неплохо было бы сделать тут что-то типа библиотечки (хранилища) где можно хранить готовые, отлаженные функции. Ведь по прошествию времени вопросы повторяются (получить IP адрес, поиск строки в файле, сортировка массивов.....). А так всем удобно, и по несколько раз на один и тот же вопрос отвечать не надо, и кому что надо предварительно там поищет не задавая лишних вопросов.
|
Сообщ.
#87
,
|
|
|
Цитата sten_11 @ Ну так это просто дублирование FAQ. Думаю неплохо было бы сделать тут что-то типа библиотечки (хранилища) где можно хранить готовые, отлаженные функции. Ведь по прошествию времени вопросы повторяются (получить IP адрес, поиск строки в файле, сортировка массивов.....). А так всем удобно, и по несколько раз на один и тот же вопрос отвечать не надо, и кому что надо предварительно там поищет не задавая лишних вопросов. |
Сообщ.
#88
,
|
|
|
Цитата sten_11 Тока почему-то народ сначала вопросы задает, и только после того как его "пошлют" смотрит FAQ. ... и кому что надо предварительно там поищет не задавая лишних вопросов... |
Сообщ.
#89
,
|
|
|
В FAQ не хватает информации, как сделать цвет фона формы прозрачым.
(Похожий на стил Vista) |
Сообщ.
#90
,
|
|
|
Было бы хорошо, если бы в FAQ был еще help по DSPACK. Уже который день роюсь в нете, более или менее приличные примеры нашел тока на Delphi...(ито, ввиду того, что эти примеры находятся в самом DSPACK).
|