Форум: "Основная";
Текущий архив: 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