Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.13;
Скачать: CL | DM;

Вниз

Передача значение из/в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
7-40682
Anatol
2003-08-01 09:03
2003.10.13
Курсор


1-40360
sunwheel
2003-10-03 10:09
2003.10.13
Кто перехватывает сообщение KeyDown?


3-40306
alextov
2003-09-22 10:01
2003.10.13
Не могу изменить запись - ORA-01403: no data found


3-40290
bushmen
2003-09-22 10:43
2003.10.13
Трёхзвенная архитектура


3-40316
Илайдж
2003-09-22 09:56
2003.10.13
2k: backup