Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение и освобождение памяти под PChar [D5]


Страницы:   1 2

Zn ©   (2002-11-14 10:31:00) 

Help me, please! Как корректно выделить и освободить память под PChar? Объем заранее неизвестен. Простите за тривиальный вопрос...


Alx2   (2002-11-14 14:05:00) [1]

>Zn (14.11.02 14:01)
>Пытался вставлять в объявления stdcall, pascal или register -
>безрезультатно.
Главное, чтобы в хосте и в dll спецификаторы вызова (stdcall, pascal или register) совпадали.
На всякий случай воткни в секцию uses модуль sharemem на первое место в dpr файле и в головном файле библиотеке. Из других мест (если есть) его выкинь.

PS
Вообще говоря, вслепую проблематично дебагить :)


Zn   (2002-11-14 14:01:00) [2]

>Alx2 © (14.11.02 13:04)
>как полностью объявлена ф-я в dll и как в родительской программе?

Идентично.
function U866(var InpStr: PChar): PChar;
Пытался вставлять в объявления stdcall, pascal или register - безрезультатно.


Alx2   (2002-11-14 13:04:00) [3]

>Zn (14.11.02 12:34)
как полностью объявлена ф-я в dll и как в родительской программе?


Zn   (2002-11-14 12:34:00) [4]

Alx2! Ваш код работает отлично, но на последне строке функции (end;) выдает "Invalid pointer operation". Хотя дальше возвращаемое значение садится куда надо и родительская программа продолжает работать.


Zn   (2002-11-14 11:36:00) [5]

Alx2 и icWasya! Благодарю за подсказку, сейчас попробую!


Alx2   (2002-11-14 11:36:00) [6]

>Zn (14.11.02 11:33)
>Это я пробовал. Не работает.
А мои посты тебе ничего не рассказали?


Zn   (2002-11-14 11:33:00) [7]

<слепой вася спокойно передает в дельфи строку:
<declare function myfunc (byval st as string) as string
<теперь в длл спокойно пишем:
<function U866(var InpStr: string): PChar;
<работаем с какой-либо внутренней переменно типа string, а в <конце функции пишем:
<result:=pchar(IntrStr);
<во всяком случае для ворд васика прокатит.

Это я пробовал. Не работает.


icWasya   (2002-11-14 11:27:00) [8]

Если посмотришь описание Windows процедур, которые используют PChar, то увидишь, что если процедура возвращает строку то она имеет приблизительно такое описание:

integer GetAnyThing(Buf:PChar;integer LenBuf);
то есть вызывающая программа заказывает массив под возвращаемую строку и передаёт процедуре размер массива и указатель на него,
а возвращает реальный размер записанных данных.

в данном случае код должен быть примерно таким:

function U866(InpStr: PChar;OutStr: PChar;OutLen:Integer):PChar;
var i,z : Word;
s: Char;
ps: PChar;
begin
i:=0;z:=0;
Result:=OutStr;
ps:=OutStr;

while InpStr[i]<>#0 do
begin
s:=InpStr[i];
case s of
"в": s:="|";
"б": s:="


Ru   (2002-11-14 11:26:00) [9]

>Zn (14.11.02 11:12)

слепой вася спокойно передает в дельфи строку:
declare function myfunc (byval st as string) as string
теперь в длл спокойно пишем:
function U866(var InpStr: string): PChar;
работаем с какой-либо внутренней переменно типа string, а в конце функции пишем:
result:=pchar(IntrStr);
во всяком случае для ворд васика прокатит.


Alx2   (2002-11-14 11:24:00) [10]

>Alx2 © (14.11.02 11:22)
Кстати, InpStr=Result после отработки ф-ии


Reindeer Moss Eater   (2002-11-14 11:23:00) [11]

Dispose(ps) - это убиение строки, которую ты так заботливо собирал внутри функции


Alx2   (2002-11-14 11:22:00) [12]

>Zn (14.11.02 11:12)
>Всё это будет сидеть DLL. Просто нужно перекодировать некоторые
>символы. Функцию будут использовать приложения Delphi и VB.

Просто перекодируем тогда по твоим мотивам:

Function U866(Const InpStr: PChar): PChar;
Var I : Integer;
Begin
Result := InpStr;
For I := 0 To StrLen(InpStr) - 1 Do
Case InpStr[I] Of
"в": Result[I] := "


Zn   (2002-11-14 11:21:00) [13]

>Reindeer Moss Eater (14.11.02 11:13)
>Так ты вернул PChar, а потом освободил память, не которую он >указывал.

Т.е.? Освободил память под локальную переменную, которая, в принципе, и сама бы должна. А я для перестраховки. Просто с указателями не очень дружу.



Reindeer Moss Eater   (2002-11-14 11:13:00) [14]

Так ты вернул PChar, а потом освободил память, не которую он указывал.


Zn   (2002-11-14 11:12:00) [15]

Всё это будет сидеть DLL. Просто нужно перекодировать некоторые символы. Функцию будут использовать приложения Delphi и VB.


Skier   (2002-11-14 11:12:00) [16]

>Zn

> Как корректно выделить и освободить память под PChar? Объем
> заранее неизвестен


Ну ежели объём заранее неизвестен, то можно просто кастингом
Что то типа :

APCharVar := PChar(AStringVar);

А вообще при выделении и освобождении памяти спасает
AllocMem(...) и FreeMem(...)


Reindeer Moss Eater   (2002-11-14 11:11:00) [17]

Так ты вернул PChar, а потом освободил память, не которую он указывал.


Alx2   (2002-11-14 11:10:00) [18]

>Zn (14.11.02 10:56)
Извини, но это бред.
Ты хочешь конвертер OemToAnsi написать?


Calm   (2002-11-14 11:08:00) [19]

Zn, страшные вещи пишите :)
А что, без PChar точно нельзя?


Zn   (2002-11-14 10:56:00) [20]

function U866(var InpStr: PChar): PChar;
var i,z : Word;
ps: PChar;
begin
New(Result);
New(ps);
z:=Length(InpStr)-1;
for i:=0 to z do
begin
ps^:=InpStr[i];
case ps^ of
"в": Result:=strcat(Result,"


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо