Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа со структурами и DLL.


Страницы:   1 2

X9 ©   (2005-08-04 09:01:00) 

Здравствуйте!

Имеется задача: создать систему работа с плагинами (динамическая загрузка). Допустим, при работе с плагином необходимо передать некоторую структуру, в полях которой имеются записи типа string, HBITMAP и Word.
Как бы это сделать малой кровью? Простое присваивание, естественно, не катит.

Заранее благодарен,
 с уважением, X9.


Mx   (2005-08-06 20:21:00) [1]


> X9 ©   (06.08.05 12:49) [32]
> Я думаю сделать так: получить размер всей структуры и с
> помощью CopyMemory просто скопировать область памяти со
> структурой из DLL в экземпляр структуры в программе. Это
> правильно?

Не фига! Область, в которой выделена память для самих строк совершенно не обязательно прилегает к полям структуры. Ты ведь знаешь, что строки - указатели. Куда они указывают - заранее неизвестно. Потому CopyMemory здесь не подходит. Более того, если внимательно посмотреть на менеджмент строк, увидишь, что не обязательно каждой строковой переменной соответствует индивидуальный адрес строки. Две переменные могут разделать один и тот же адрес строки. Это вторая причина по которой CopyMemory неподходит. Копируй строки вручную.


X9   (2005-08-06 12:49:00) [2]

2 Mx
>> У меня есть вопрос: зачем тебе вычислять такой "размер" структуры?
Я думаю сделать так: получить размер всей структуры и с помощью CopyMemory просто скопировать область памяти со структурой из DLL в экземпляр структуры в программе. Это правильно?


Mx   (2005-08-06 01:37:00) [3]


> X9 ©   (06.08.05 01:25) [30]

У меня есть вопрос: зачем тебе вычислять такой "размер" структуры?


X9   (2005-08-06 01:25:00) [4]

2 Mx
>> Никакой длины строк SizeOf не вернет.
Извините, я видимо неправильно выразился. Я имел ввиду то, что полный размер структуры = SizeOf(TMyRecord) + длина всех строк в ней.

Всё, наконец-то разобрался.

Спасибо огромное всем ответившим и модераторам за их терпение (постараюсь больше не дублировать сообщения, это всего-лишь недостатки DialUp'а).


Mx   (2005-08-05 22:05:00) [5]


> X9 ©   (05.08.05 17:31) [28]

Никакой длины строк SizeOf не вернет. Её результат - кол-во байтов необходимых для хранения всех полей структуры. Т.к. string указатель, данные на которые он указывает не относится к полям структуры.


X9   (2005-08-05 17:31:00) [6]

2 evvcom
>> Размер структуры = SizeOf(TMyRecord)
+ длина строк, так я понимаю? Потому что, например, SizeOf(вышеприведённая структура) возвращает 24.
Если я прав, тогда всё! :)


X9   (2005-08-05 17:31:00) [7]

2 evvcom
>> Размер структуры = SizeOf(TMyRecord)
+ длина строк, так я понимаю? Потому что, например, SizeOf(вышеприведённая структура) возвращает 24.
Если я прав, тогда всё! :)


evvcom   (2005-08-05 16:02:00) [8]

Размер структуры = SizeOf(TMyRecord)


Mx   (2005-08-05 15:36:00) [9]

Что за разделение полей? Что за размер "самой" структуры?


X9   (2005-08-05 15:12:00) [10]

Скажите пожалуйста, как правильно посчитать размер нижеописанной структуры:

type
 TMyRecord = packed) record
   StrValue1, // Длина строки 300 символов | 300 + 4 байт
   StrValue2, // -//-         310   -//-   | 310 + 4 байт
   StrValue3, // -//-         320   -//-   | 320 + 4 байт
   StrValue4: string; // -//-  330  -//-   | 330 + 4 байт
   BitmapBits: Pointer; // | 4 байта
   Version: Word; // | 2 байта
 end;


С содержимым всё ясно, но как быть с самой структурой (разделение полей и т.д.)?


evvcom   (2005-08-05 14:21:00) [11]


> А как быть с результатом неизвестного размера?

Реализовывать точно так же, как и пара GetWindowTextLength и GetWindowText. Конечно, не нстолько это удобно, как работать со string, но зато универсально.


Mx   (2005-08-05 10:17:00) [12]


> evvcom ©   (05.08.05 09:55) [21]
> Ленивый что-ль

Ленивый, да. Бесит после вызовов функции ставить FreeMem. Если это может провернуть компилятор, то пусть он и делает.


> "где выделил, там и освобождай".

А как быть с результатом неизвестного размера? Дурацкий HRESULT и var параметры при необходимости вернуть строку ой как бесят.


evvcom   (2005-08-05 09:55:00) [13]


> А то: в DLL выдели - в приложении освободи... напрягает.

Чего напрягает? Ленивый что-ль? А ошибки, связанные с неправильным использованием string и ей подобных не напрягают? Когда компилятор за тебя неявно сам освобождает, как тебе казалось, нужную еще память? Может и зря я это написал? :)
А вообще более принято "где выделил, там и освобождай".


X9   (2005-08-05 07:22:00) [14]

2 Mx
Спасибо! Буду смотреть.


Mx   (2005-08-04 18:46:00) [15]

На фига точка в URL забралась? Адрес:   http://interface.ru/fset.asp?Url=/borland/decom_1.htm


Mx   (2005-08-04 18:45:00) [16]


> X9 ©   (04.08.05 18:38) [16]

Ссылок нет. WideString - тип для строк в COM (там он представлен типом BSTR). Я сам никогда не работал, потому и спросил. Как я понял с ним такой возни как с PChar (в плане выделения памяти) не требуется.

Про интерфейсы и как их реализовать для plug-in посмотри вот тут: http://interface.ru/fset.asp?Url=/borland/decom_1.htm.См. "продолжение статьи"...


X9   (2005-08-04 18:38:00) [17]

2 evvcom
Кроме меня никто плагины для этой программы писать не будет, это точно, к тому же проект некоммерческий. Это, по сути, и не плагины вовсе - каждая из таких DLL'ок является модулем с абсолютно различной функциональностью, программа лишь обеспечивает минимум необходимых функций, общих для всех модулей и оболочку.

2 Mx
Может оно и лучше, только вот я раньше с Юникодом не работал :(. А нет ли у Вас хорошей ссылки по данному материалу?

2 inic
Каюсь, но в интерфейсах я тоже ни бум-бум. Может быть, и у Вас ссылочка завалялась?


X9   (2005-08-04 18:38:00) [18]

2 evvcom
Кроме меня никто плагины для этой программы писать не будет, это точно, к тому же проект некоммерческий. Это, по сути, и не плагины вовсе - каждая из таких DLL'ок является модулем с абсолютно различной функциональностью, программа лишь обеспечивает минимум необходимых функций, общих для всех модулей и оболочку.

2 Mx
Может оно и лучше, только вот я раньше с Юникодом не работал :(. А нет ли у Вас хорошей ссылки по данному материалу?

2 inic
Каюсь, но в интерфейсах я тоже ни бум-бум. Может быть, и у Вас ссылочка завалялась?


inic   (2005-08-04 17:09:00) [19]

X9 ©   (04.08.05 9:01)

Ветку всю не осилил, так что если повторюсь извините

По сабжу можно попробовать интерфейсы.


Digitman   (2005-08-04 16:35:00) [20]


> Mx ©   (04.08.05 15:33) [13]


> в DLL выдели - в приложении освободи


иной раз и мелкомягкие так же поступают в своем WinAPI


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо