|
|
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
DLL на C++, приложение на Delphi. Функция в DLL должна вернуть список данных в виде массива указанной структуры. Допустим вот такая простая структура, зато в которой и строка и число есть: C++: Код: plaintext 1. 2. 3. Delphi: Код: plaintext 1. 2. 3. Требуется: Функция в DLL должна вернуть список всех найденных людей в виде массива указанной структуры. Причём размер массива заранее не известен, в том числе может быть и нулевым. Как это правильно сделать, чтобы работало из Delphi и не было разнообразных утечек памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2007, 08:44 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
Во-первых, тебе надо добиться, чтобы компиляторы использовали одинаковое выравнивание. Проверить это проще всего, сравнив sizeof (TPerson). В дельфе можно отменить выравнивание, сказав packed record, в C++ для этого кажется соответствующая прагма. Во-вторых, тебе нужно, чтобы для выделения и освобождения использовался один и тот же менеджер памяти. Это можно сделать несколькими путями, например: - подключить в DLL дельфовые функции GetMem/FreeMem - использовать для выделения и освобождения функции Win API - по завершении работы со структурой передать ее функции "освободить", также расположенной в DLL. Последний путь - пожалуй, наиболее правильный. Наконец, тебе надо обеспечить удобное освобождение памяти, без идиотского цикла с освобождением каждой строки. Обычно это делается так: выделяется кусок памяти, и в нем размещаются данные следующим макаром: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2007, 08:57 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
Смысл третьего варианта понятен. Хотелось бы ответ получить наглядным примером. Или подскажите, где его можно найти. Книги листал, везде только простые примеры приводят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2007, 14:41 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
vas177Допустим вот такая простая структура, зато в которой и строка и число есть:Это не простая структура. Указатель всегда указывает на какой-то участок памяти, а этот участок памяти кому-то принадлежит. Передавая указатели тебе всегда надо помнить кому эта память принадлежит. Лучше положить внутрь структуры массив char'ов. А за примерами - ну вот возьми Far, и посмотри его плагинную систему. Там есть примеры писания аналогичных dll'ек и на Си, и на Дельфях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2007, 19:14 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlЭто не простая структура. Хм. White OwlЛучше положить внутрь структуры массив char'ов. И начать очередную серию идиотских проблем вида "в нашей системе имя может быть максимум 20 символов"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 09:31 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > И начать очередную серию идиотских проблем вида "в нашей системе имя > может быть максимум 20 символов"? > По-моему, лучше тогда будет, если эти структуры будут жить внутри библиотеки, и создавасться/уничтожаться ей же. Т.е. мендежеры памяти будут раздельные. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 11:43 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
ErVПо-моему, лучше тогда будет, если эти структуры будут жить внутри библиотеки, и создавасться/уничтожаться ей же. Я назвал этот вариант как предпочтительный. ErVТ.е. мендежеры памяти будут раздельные. Но в целом тут вопрос. Имхо, правильный ответ зависит от архитектуры решения в целом. Если это "маленький плагин к большой системе", то пусть он лучше будет замкнутым и самодостаточным. А если система в целом плагинная, лучше опубликовать общее API в том числе менеджера памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 12:02 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarer wrote: > Но в целом тут вопрос. Имхо, правильный ответ зависит от архитектуры > решения в целом. Если это "маленький плагин к большой системе", то > пусть он лучше будет замкнутым и самодостаточным. А если система в > целом плагинная, лучше опубликовать общее API в том числе менеджера > памяти. > Логично, полностью согласен. Я просто исходил из предположения, что система небольшая.(например, дельфийские GUI/C++ движок для небольшого приложения) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 12:28 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
использовать для размещения передаваемых данных default process heap, тогда память можно будет освобождать где угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 16:18 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarer White OwlЭто не простая структура. Хм.Есть такое правило для коммуникационных протоколов: все данные для сообщения должны хранится в самом сообщении. Нарушение этого правила приводит к необходимости организовывать общую память для отправителя и получателя, и организовывать систему управления этой общей памятью. В твоем первом сообщении в этом топике ты уже предлагал несколько решений как сделать эту самую разделяемую память. softwarer White OwlЛучше положить внутрь структуры массив char'ов. И начать очередную серию идиотских проблем вида "в нашей системе имя может быть максимум 20 символов"?В случае такой структуры сообщения - да, эта проблема будет. Ее можно решить выделив заранее достаточно большой буфер, либо пересортировать структуру - элементы с фиксированым размером в начало, массивы с изменяем размером в конец и добавить в начало элементы - размер_такого_то_массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 19:01 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White Owl wrote: > В случае такой структуры сообщения - да, эта проблема будет. Ее можно > решить выделив заранее достаточно большой буфер Можно изменить сам тип сообщения на нечто вроде: Код: plaintext 1. 2. 3. 4. 5. хвост. но только тогда придется по нему гулять адресной арифметикой, что под дельфей будетт не совсем удобно. Или можно свалить все в один большой буфер, в начале которого будут идти сами записи, а в конце - строки, а вместо PChar будет смещение к нужной строке, в байтах, от начала буфера. Можно даже просто банально сохранить все строки в конце блока памяти, и использовать PChar вместо смещений. Тогда, возможно, потребуется меньше выкрутасов для освобождения памяти для строк. Хотя, если строки надо менять, то болты. (с другой стороны, pchar как бы для этого не совсем подходит). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 20:23 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
ErV> В случае такой структуры сообщения - да, эта проблема будет. Ее можно > решить выделив заранее достаточно большой буфер Можно изменить сам тип сообщения на нечто вроде:Я ж именно про это и говорил? Сразу после процитированного куска :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 20:28 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlЕсть такое правило для коммуникационных протоколов: все данные для сообщения должны хранится в самом сообщении. Нарушение этого правила приводит к необходимости организовывать общую память для отправителя и получателя, и организовывать систему управления этой общей памятью. В твоем первом сообщении в этом топике ты уже предлагал несколько решений как сделать эту самую разделяемую память. Извини, но тебя куда-то понесло. Попробую ответить тебе в твоей терминологии: "самим сообщением" в данном случае является указатель на массив структур. И именно адресованный массив хранится в общей памяти итп. Модификация предложенного тобой типа в данном случае никак не влияет на необходимость организации общей памяти и применения названных мной (или других) методов. Надеюсь, ты не пытаешься намекнуть на желательность передачи массива структур по значению. Это, конечно, решит задачу освобождения памяти, но это единственное достоинство такого решения.... White Owlлибо пересортировать структуру - элементы с фиксированым размером в начало, массивы с изменяем размером в конец и добавить в начало элементы - размер_такого_то_массива. И мы придем к нарисованному мной куску памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 20:48 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
ErVно только тогда придется по нему гулять адресной арифметикой, что под дельфей будетт не совсем удобно. Под дельфей это не менее удобно, чем под си, но смысла в этом в данном случае нет. Точнее, он может быть в том случае, если алгоритм формирования массива окажется неудобен для формирования структуры наподобие нарисованного мной куска памяти. ErVа вместо PChar будет смещение к нужной строке, в байтах, И получим лишний геморрой на пустом месте. Буфер нам все равно потребуется освобождать, а раз так, эта конструкция по сравнению с моей имеет единственное "достоинство" - усложненный доступ к строкам. ErVМожно даже просто банально сохранить все строки в конце блока памяти, и использовать PChar вместо смещений. Странным путем пришли к моей конструкции :) Очень странным путем :)) ErVТогда, возможно, потребуется меньше выкрутасов для освобождения памяти для строк. Тогда потребуется ноль выкрутасов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 20:54 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White Owl wrote: > Я ж именно про это и говорил? Пардон. Прочел первую фразу, развил идею, в результате получилось то же самое :). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2007, 20:55 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarerИзвини, но тебя куда-то понесло. Попробую ответить тебе в твоей терминологии: "самим сообщением" в данном случае является указатель на массив структур. И именно адресованный массив хранится в общей памяти итп.эээээ..... да конечно. НО! Здесь есть один подводный камешек: когда люди работают с указателем на структуру они обычно помнят о том что это указатель и с памятью надо быть аккуратными. А вот когда дело касается строк - есть тенденция забывать про это... Особенно если строки кидаются между разными языковыми системами. Ну и во вторых, одно дело работать со многими отдельными кусками памяти (один кусок на массив и по кусочку на каждую строку в каждом элементе массива) либо с одним единственным куском. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 02:05 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlА вот когда дело касается строк - есть тенденция забывать про это... И при этом писать на сях? В этом случае можно уже не заботиться о передаче информации между модулями :) White OwlНу и во вторых, одно дело работать со многими отдельными кусками памяти (один кусок на массив и по кусочку на каждую строку в каждом элементе массива) либо с одним единственным куском. И какое отношение эти разные дела имеют к обсуждаемому вопросу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 03:19 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlЕсть такое правило для коммуникационных протоколов: все данные для сообщения должны хранится в самом сообщении. Нарушение этого правила приводит к необходимости организовывать общую память для отправителя и получателя, и организовывать систему управления этой общей памятью.отправитель и получатель находятся в одном процессе, в рамках которого системой уже предоставляется общая память и система управления ею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 12:11 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarer White OwlА вот когда дело касается строк - есть тенденция забывать про это... И при этом писать на сях? В этом случае можно уже не заботиться о передаче информации между модулями :)Не на сях, а на дельфях и сях, смотри начальный вопрос топика. softwarer White OwlНу и во вторых, одно дело работать со многими отдельными кусками памяти (один кусок на массив и по кусочку на каждую строку в каждом элементе массива) либо с одним единственным куском.И какое отношение эти разные дела имеют к обсуждаемому вопросу?Те же самые - с одним куском работать проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 18:03 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlНе на сях, а на дельфях и сях Ты так говоришь, словно для "супа с грибами и картошкой" поганки отфильтровывать необязательно. White OwlТе же самые - с одним куском работать проще. И кто мешает работать с одним куском, не влезая в описанный тобой геморрой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 18:13 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarer White OwlТе же самые - с одним куском работать проще. И кто мешает работать с одним куском, не влезая в описанный тобой геморрой?А какой геморрой я описывал? Ладно, судя по тому что я начинаю терять нить флейма - флейм пора прекращать :) Подытожу - лично для меня, при писании в нескольких средах, намного удобнее будет вставлять строки в структуру целиком а не класть в структуру указатель на внешнюю строку. Проще работать потому что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 18:21 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlА какой геморрой я описывал? Структуру хранения, не обеспечивающую произвольный доступ к элементам. White OwlПодытожу - лично для меня, при писании в нескольких средах, намного удобнее будет вставлять строки в структуру целиком а не класть в структуру указатель на внешнюю строку. Проще работать потому что. Следует ли понимать так, что при работе в одной среде структура таки будет нормальной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 18:29 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarer White OwlА какой геморрой я описывал? Структуру хранения, не обеспечивающую произвольный доступ к элементам.Такую фигню я никак не мог описывать! Либо кто-то плохо читает... либо кто-то плохо пишет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 18:34 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
White OwlТакую фигню я никак не мог описывать! Либо кто-то плохо читает... либо кто-то плохо пишет :) Однако, описал: http://www.sql.ru/forum/actualthread.aspx?tid=471697#4652211 , последняя строка. Представь себе, что тебе надо уложить, например, 10 строк. Ты "пересортировал структуру" - то есть сделал сначала 10 int-ов с "размерами каждого массива", затем сами символы. Каким образом ты выполнишь операцию "вернуть шестую строку" не делая цикла по предыдущим индексам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 18:38 |
|
||
|
DLL на C++, приложение на Delphi. Возвращение результата в виде массива структуры
|
|||
|---|---|---|---|
|
#18+
softwarerПредставь себе, что тебе надо уложить, например, 10 строк. Ты "пересортировал структуру" - то есть сделал сначала 10 int-ов с "размерами каждого массива", затем сами символы. Каким образом ты выполнишь операцию "вернуть шестую строку" не делая цикла по предыдущим индексам?Я не могу представить себе зачем бы понадобилось передвать десяти-элементный массив, а потом обращаться к шестому элементу. В нормальной ситуации ты как раз будешь проходить по всему массиву элемент за элементом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2007, 19:03 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=34787114&tid=1345845]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 493ms |

| 0 / 0 |
