Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
1-40450
Duncan
2003-10-02 17:20
2003.10.13
контроль версий


1-40436
Ден
2003-10-02 23:13
2003.10.13
Прога с файлами


4-40730
Onyx
2003-08-08 13:08
2003.10.13
КОНТЕКСТНОЕ МЕНЮ!!!


11-40335
DrFaust
2003-01-21 13:37
2003.10.13
PageControl


1-40493
Максим
2003-10-03 10:09
2003.10.13
Окно не прямоугольной формы ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский