Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];

Вниз

Истчо вопрос по DLL   Найти похожие ветки 

 
Aleksandr   (2002-06-13 11:13) [0]

Расскажите, специалисты, вот такой момент. Понятно, что DLL, готовящаяся к совместимости на разные языки программирования, должна строковые данные получать и отдавать через PChar. Но вот допустимо ли, чтобы она сама внутренние действия совершала при помощи string? То есть, допустим, функция из DLL должна вернуть строку, при этом внутри она запрашивает мой объект, он ей возвращает значение string, и она уже делает что-нибудь типа
GetMem(Result);
Result:=PChar(S)?
Не повлияет ли это на совместимость?


 
Внук   (2002-06-13 11:17) [1]

Запросто (в смысле - можно, в смысле - не повлияет). Только надо разобрать, кто будет память освобождать :)


 
Игорь Шевченко   (2002-06-13 11:22) [2]

Повлияет.


> GetMem(Result);
> Result:=PChar(S)?


Это гарантированная ошибка

Лучше так:

GetMem(Result, Succ(Length(S));
StrPCopy(Result,S);



 
Fiend   (2002-06-13 11:24) [3]

то то же! И ваще красивее делать типа
dll :
function SdelatElementarnoe(pM: pointer): bool

а в приложении уже :
1.Выделить память
2.Вызвать хвункцию
3.Если она сказала ДА, то сделать чёто, если НЕТ, то Вывести ЕГГОГ
4.Освободить память


 
Внук   (2002-06-13 11:28) [4]

>>Игорь Шевченко © (13.06.02 11:22)
Я на код не смотрел, комментировал только идею :)


 
Игорь Шевченко   (2002-06-13 11:44) [5]

Внук © (13.06.02 11:28)

Идея, безусловно хорошая :-)
Но плохая реализация может загубить хорошую идею на корню :-)))


 
Aleksandr   (2002-06-13 11:47) [6]

Пасибо... Сорри, что забыл параметр у гетмымы использовать...
Что-то я не понял про фразу по поводу освобождения памяти. Это, как я понимаю, должно оставаться на совести использующего функцию, если при выходе из подпрограммы локальная переменная вообще сама не убивается?


 
Внук   (2002-06-13 11:54) [7]

GetMem - это уже динамическая переменная, а не статическая, сама из памяти не уйдет. А по поводу памяти - для чистой совести использующего он должен про это знать (я на комментарии намекаю), тем более здесь два классических подхода: память под результат выделяет вызывающий, тогда само собой он ее освобождает. Или память выделяет вызываемый, тогда нужно об этом предупредить каким-нибудь комментарием.
Лично мне удобнее в таких случаях вообще использовать процедуру, а не функцию, с одним out-параметром.


 
Игорь Шевченко   (2002-06-13 11:57) [8]

Внук © (13.06.02 11:54)

Лучше - вызывающий. Как это реализовано в WinAPI


 
Aleksandr   (2002-06-13 12:42) [9]

Понял, спасиб... Пусть память выделяет вызывающий... Только откуда ж ему будет знать, сколько ее выделить, особенно если в аутпут теоретически может входить строка, сформированная из добрых двухсот элементов StringList?


 
Fiend   (2002-06-13 12:47) [10]

А ты выдели, и скажи вызываемому, скока дал
Или сделай так, передавай вызываемому переменную, куда он вернёт указатель на созданную область памяти, так многие функции АПИ делают


 
Игорь Шевченко   (2002-06-13 12:47) [11]

Aleksandr © (13.06.02 12:42)

Справочку по функциям WinAPI почитать не мешает...

function MyFunc (AString : PChar; AStringSize : Integer) : Integer;

Функция должна возвращать количество байт, потребное для размещения всей строки. Но записывать ровно столько, сколько указано в параметре AStringSize. Вызывающий будет знать, анализируя значение - влезло/не влезло



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.01 c
3-77318
Андр
2002-05-30 18:56
2002.06.24
Проблема с dxDBGrid


14-77592
angelcom
2002-05-21 23:41
2002.06.24
Срочно нудна библиотека ....


7-77647
AlexanderBogdanov
2002-03-21 10:59
2002.06.24
Как изменить частоту вращения вентилятора на процессоре ?


1-77375
Night
2002-06-13 13:12
2002.06.24
Запуск из Делфи другую прогу


1-77442
Raiv
2002-06-11 15:09
2002.06.24
GetVolumeInformation





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский