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

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

PCHAR [D5, Win95/98, WinXP]


GanibalLector ©   (2004-12-21 01:23:00) 

Имеется Pchar наполненный некоторыми данными(Р1).Необходимо создать еще один Pchar(Р2),который будет заполнен по некоторому алгоритму.
Предположим,необходимо скопировать первые  3 байта из Р1,затем добавить 4 и 2 байт и т.д.
Сделал такой сабж и не пойму где ошибся:

var P1,P2:Pchar;
begin
P1 := PChar(AllocMem(10));
P2 := PChar(AllocMem(4));
StrCat(P1,Pchar('123456789'));
Move(P1^,P2^,3);
Move(StrLcat(p2,@p1[4],1)^,p2^,1);// НЕ РАБОТАЕТ
Move(StrLcat(p2,@p1[2],1)^,p2^,1);//ЭТО ТОЖЕ
Freemem(P1);
Freemem(P2);
end;


GanibalLector   (2005-01-03 21:44:00) [1]

На самом деле,есть решение по-проще ;)
Забить на Pchar и поставить Pointer.
Что-то типа :

function potok(Param: Pointer): DWord; stdcall;
var hFile:HWND;Size:Cardinal;
pOldInfo,Res:Pointer;
iBytesRead:Cardinal;
i,n_addr:integer;
begin
//читаем
hFile:=CreateFile(
                 pChar(File_Name),
                 GENERIC_READ ,
                 0,
                 nil,
                 OPEN_ALWAYS,
                 FILE_ATTRIBUTE_NORMAL,
                 0);
if hFile=invalid_handle_value then begin
  sendmessage(MainWnd,WM_USER+2,0,0); //Error
  Result:=0;exitthread(Result);exit;end;
Size := GetFileSize(hFile,nil);
GetMem(pOldInfo, GetFileSize(hFile,nil));
ReadFile(hFile,pOldInfo^,GetFileSize(hFile,nil),iBytesRead,nil);
CloseHandle(hFile);

// создаем "правильный" буфер
GetMem(Res,(Size-$0d)*2 );
//Move(pOldInfo^,Res^,$10);
n_addr:=$0;
for i:=$0e to Size-1 do begin
PByte(integer(res)+n_addr)^:=PByte(integer(pOldInfo)+i)^ and $f0;
PByte(integer(res)+n_addr+1)^:=(PByte(integer(pOldInfo)+i)^ and $0f)shl 4;
inc(n_addr,2);        end;
...
//там много всего


GuAV   (2004-12-21 13:06:00) [2]

2 GanibalLector ©  

SetString(S, P, Count)

копирует из PChar в string Count символов  с нулями, если они там есть.

Но заголовок всё равно будет прерван нулём


Anatoly Podgoretsky   (2004-12-21 11:31:00) [3]

GanibalLector ©   (21.12.04 03:17) [9]
А не считай это PChar, все его функции работают с ASCIIZ. используй string


jack128   (2004-12-21 03:23:00) [4]

А стринг от нулей не зависит. В отличии от PChar'а.  Так и делаешь StringVar := 'Const' + #0 + OtherStringVar + #0 + PCharVar;


GanibalLector   (2004-12-21 03:17:00) [5]

2 jack128 © [8]
Я знаю,что так должно быть.Но у меня в Pchar сидит много нулей и мне нужно с ними работать.А Вы советуете в string.Вот и спрашиваю...


jack128   (2004-12-21 03:06:00) [6]

А чтот побороть??  Если про тоо, что вторая единичка в Caption'e не показывается, то так и должно быть.  И вообще - не проще Caption := '1234567'; - эффект будет то же ;-)


GanibalLector   (2004-12-21 02:52:00) [7]

>А ваще забей на PChar - string рулит.

P1 := PChar(AllocMem(10));
 StrCat(P1,Pchar('1234567'+ chr(0)+'1'));
 Caption:=String(p1);
 Freemem(P1);

А как это побороть?


jack128   (2004-12-21 02:50:00) [8]

Вот потому что пытаетесь всякими сишным функциями извращаться, потому и путаетесь ;-))
Если бы поставили жесткое условие не использовать длинные строки, то я бы написал так:
GetMem(Result, 6);
Move(Source^, Result^, 3);
Result[3] := Source[3]; // не забываем, что индексация начинается с нуля.
Result[4] := Source[1];
Result[5] := #0;
А вообще см
GuAV ©   (21.12.04 2:34) [2]
А ваще забей на PChar - string рулит.


GuAV   (2004-12-21 02:47:00) [9]

Виноват это снимается - AllocMem с GetMem попутал
GuAV ©   (21.12.04 2:34) [2]
StrCat(P1,Pchar('123456789')); и ? к чему строка присоединена ? к нуль терминатору мусора.


GanibalLector ©   (21.12.04 2:37) [3]
В чем трабл?

Последний параметр StrLcat - длина результата, а не добавляемой строки.


GuAV   (2004-12-21 02:46:00) [10]

Виноват это снимается - AllocMem с GetMem попутал
GuAV ©   (21.12.04 2:34) [2]
StrCat(P1,Pchar('123456789')); и ? к чему строка присоединена ? к нуль терминатору мусора.


GanibalLector ©   (21.12.04 2:37) [3]
В чем трабл?

Последний параметр StrLcat - длина результата, а не добавляемой строки.


GanibalLector   (2004-12-21 02:37:00) [11]

2 GuAV
Извини,но с инглишем плохо(да и переводчики толком не переводят).В чем трабл?


GuAV   (2004-12-21 02:34:00) [12]

StrCat(P1,Pchar('123456789')); и ? к чему строка присоединена ? к нуль терминатору мусора.

не проверял но имхо так:

P1 := PChar(AllocMem(10));
P2 := PChar(AllocMem(6));
StrCopy(P1,Pchar('123456789'));
StrLCopy(p2, p1, 3);
StrLCat(p2, p1+4, 4);
StrLCat(p2, p1+2, 5);

А ваще забей на PChar - string рулит.


GuAV   (2004-12-21 02:27:00) [13]

GanibalLector ©   (21.12.04 1:23)
StrLcat(p2,@p1[4], 1)

StrLCat appends at most MaxLen - StrLen(Dest) characters from Source to the end of Dest and returns Dest. That is, MaxLen indicates the maximum length that is allowed in the result string.


Наверх

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