Главная страница
    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.47 MB
Время: 0.009 c
1-77416
VJar
2002-06-10 21:53
2002.06.24
Окно завершения работы Windows


1-77473
Sniffer
2002-06-11 19:29
2002.06.24
Чёртик, бегающий по экрану


4-77700
ATLANTIDO
2002-04-21 16:48
2002.06.24
Дочерние окна


1-77393
метеоролог
2002-06-13 10:50
2002.06.24
Quick Report file


3-77262
Cooper
2002-05-30 10:04
2002.06.24
TDBChart, TSeries и ежы с ним





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