![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.