Форум: "Основная";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
ВнизПередача значение из/в DLL Найти похожие ветки
← →
Dubby (2003-10-01 18:15) [0]В программе используются плагины на основе DLL. Требуется передавать длинные текстовые значения из/в этих плагинов.
Хочется, чтобы тип передаваемых значений не был сугубо дельфовым типа shortstring. Pchar в принципе подходит, но если передавать просто pchar(some_string) - передаётся ерунда(по понятным причинам), выделять динамически память под этот pchar - возникают проблемы с последующим освобождением этой памяти....
Как лучше решить эту проблему?
← →
Digitman (2003-10-01 18:18) [1]
> передаётся ерунда(по понятным причинам)
"ерунда" - это как ?
и по каким, позволю себе уж полюбопытствовать, "понятным причинам" ? что это действо "по понятиям" еще взялось ? в первый раз слышу !
← →
Skier (2003-10-01 18:19) [2]
> Хочется, чтобы тип передаваемых значений не был сугубо дельфовым
> типа shortstring.
Ну если тебе не нравиться название shortstring так и скажи...
> . Pchar в принципе подходит, но если
Не в принципе, а просто - подходит !
А вообще для передачи данных существует специальное сообщение
WM_COPYDATA
← →
Dubby (2003-10-01 18:30) [3]"ерунда" - это как ?
и по каким, позволю себе уж полюбопытствовать, "понятным причинам" ? что это действо "по понятиям" еще взялось ? в первый раз слышу !
а вы попробуйте...
Передаётся или просто мусор, или кусок текста(2-3 символа) и мусор....
← →
Dubby (2003-10-01 18:32) [4]Ну если тебе не нравиться название shortstring так и скажи...
В С++,VB нет shortstring
Не в принципе, а просто - подходит !
Если руками делать getmem freemem
А вообще для передачи данных существует специальное сообщение
WM_COPYDATA
Зачем для работы с подлинкованной dll использовать WM_COPYDATA?
← →
Skier (2003-10-01 18:36) [5]>Dubby (01.10.03 18:32) [4]
Почитай про shortstring и ответь на контрольный вопрос :
Есть ли в C++ массив символов ?
← →
VAleksey (2003-10-01 18:43) [6]Бред какой-то.
Я извиняюсь.
← →
Dubby (2003-10-01 18:50) [7]Почитай про shortstring и ответь на контрольный вопрос :
Есть ли в C++ массив символов ?
Почитайте сначала сами.
1. Первым байтом идёт размер => это не просто массив символов
2. Размер ограничен 255 символами. Я писал: "Требуется передавать длинные текстовые значения". Shortstring был приведён просто для примера.
← →
Dubby (2003-10-01 18:53) [8]/VAleksey © (01.10.03 18:43) [6]
Бред какой-то.
Я извиняюсь./
Большое спасибо за помощь
← →
Skier (2003-10-01 18:54) [9]>Dubby (01.10.03 18:50) [7]
> 1. Первым байтом идёт размер
И что ?
> Shortstring был приведён просто для примера.
Не надо таких примеров.
← →
Dubby (2003-10-01 18:57) [10]>И что ?
А то, что в сях придётся писать отдельный класс для работы с таким типом данных.
К тому же, почему shortstring не подходит, я уже написал.
>Не надо таких примеров.
не надо таких ответов. если не можете ответить по существу - лучше промолчать
← →
VAleksey (2003-10-01 19:01) [11]
> последующим освобождением этой памяти.
В чем заключаются "проблемы"?
← →
VAleksey (2003-10-01 19:03) [12]Может опишешь "проблему"?
Просто я, например, (и Skier думаю тоже) проблемы не вижу.
Ты уж извини :-((.
;-)
← →
Игорь Шевченко (2003-10-01 19:15) [13]А программа и плагины на каком языке написаны ?
Если все на Delphi, то uses ShareMem и эта..хоть как передавать
← →
Rem (2003-10-01 19:15) [14]А почему shortstring? Почему не просто string? Он и с PChar совместим (думаю, это понятно:). Ну и ShareMem...
← →
nikkie (2003-10-01 19:17) [15]аллокировать/освобождать память надо в одном и том же модуле. нельзя сделать GetMem в dll, а FreeMem - в exe. варианты решения
1. exe не аллокирует память под строку, аллокирует dll с помощью GetMem. для освобождения памяти вызывается еще одна функция dll, которая и делает FreeMem.
2. аллокирует память exe, передает ее в dll с указанием размера. если размер недостаточен, функция dll возвращает ошибку и требуемый размер.
3. аллокирование/освобожение памяти производится с помощью API-функций, например HeapAlloc/HeapFree, VirtualAlloc/VirtualFree, CoTaskMemAlloc/CoTaskMemFree, SysAllocString/SysFreeString. вызовы Alloc и Free могут находиться в разных модулях.
4. ShareMem
← →
panov (2003-10-01 20:49) [16]1. Обязательно проверь соглашение о вызовах.
2. Если не хочешь работать со стандартными типами, то передвай указатель(тип Pointer), а в DLL обрабатывай, как тебе хочется.
3. Используй правило:
Если выделяещь память в DLL, то там же и делай ее реорганизацию и освобождение, и наоборот, касательно основного модуля.
← →
Dubby (2003-10-01 21:29) [17]2VAleksey: См. пост nikkie: аллокировать/освобождать память надо в одном и том же модуле. нельзя сделать GetMem в dll, а FreeMem - в exe - это не всегда возможно.
2Игорь Шевченко, 2Rem: Внимательно смотрим начало трэда. В Vc++, VB НЕТ ShareMem
2nikkie: наконец-то появился знающий человек! :)
варианты 1,2: слишком много дополнительных телодвижений...
вариант 3 не подходит по вышеуказанным причинам
А вот вариант 3 похоже то, что надо!
← →
Игорь Шевченко (2003-10-02 12:36) [18]Dubby (01.10.03 21:29)
А...вообще-то рекомендуется язык указывать заранее, в самом вопросе. Heap-фукнции
← →
Radionov Alexey (2003-10-02 12:57) [19]Посмотри, как это уже реализовано.
Если взять API, например функцию
DWORD GetFullPathName(
LPCTSTR lpFileName, // address of name of file to find path for
DWORD nBufferLength, // size, in characters, of path buffer
LPTSTR lpBuffer, // address of path buffer
LPTSTR *lpFilePart // address of filename in path
);
Видим, что туда передается наша строчка и размер буфера (с сылкой на сам буфер) дабы функция знала "сколько вешать" при возвращении результата.
А как этот буфер мы организовали - функцию не касается.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.015 c