![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите пожалуйста, что я делаю не правильно. [NT4]
zaN0za © (2005-11-06 01:20:00)доброго времени суток, уважаемые мастера.
вопрос такой:
есть модуль:
unit Unit1;
interface
uses Windows;
function za_copy(lpStr: PChar; index, count: Cardinal): PChar; stdcall;
implementation
function za_copy(lpStr: PChar; index, count: Cardinal): PChar; stdcall;
var
i : Cardinal;
szBuff : array of Char;
begin
SetLength(szBuff, lstrlen(lpstr));
for i := index to count do
szBuff[i] := lpstr[i];
szBuff[count] := #0;
Result := @szBuff[index];
end;
end.
делаю так:
program test;
uses
windows, unit1;
var
a, b : PChar;
count : cardinal;
begin
a := '0123456789';
count := 3;
b := VirtualAlloc(nil, count, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
lstrcpy(b, za_copy(a, 0, count));
messagebox(0, b, 'info', 0);
VirtualFree(b, 0, MEM_RELEASE);
end.
Не работает. Подскажите пожалуйста, что я делаю не правильно.
Спасибо за внимание.
Набережных С. (2005-11-06 11:48:00) [1]
> gdaujk © (06.11.05 11:05) [5]
Я бы даже рискнул сказать "нужно". В соответствии с документацией. И тот факт, что текущая реализация VirtualAlloc "проглатывает" эту несуразицу, ничего не меняет.
ЗЫ. Поставляемый с Delphi Win32SDK.hlp - фтопку.
gdaujk (2005-11-06 11:05:00) [2]gdaujk © (06.11.05 02:18) [2]
Много ошибок, исправляйте сами...
Набережных С. © (06.11.05 09:25) [4]
Ваша правда, можно и без MEM_RESERVE.
Набережных С. (2005-11-06 09:25:00) [3]
> MEM_COMMIT or MEM_RESERVE
Оригинально!:)
gdaujk (2005-11-06 02:27:00) [4]Вроде лучше, чтоб Index + Count было менше lstrlen(lpstr)... Но почему-то и в этом случае всё работает???
gdaujk (2005-11-06 02:18:00) [5]
unit Unit1;
interface
uses Windows;
function za_copy(lpStr: PChar; index, count: Cardinal): PChar; stdcall;
implementation
function za_copy(lpStr: PChar; index, count: Cardinal): PChar; stdcall;
var
i : Cardinal;
szBuff : array of Char;
begin
SetLength(szBuff, Count + 1);
for i := index to count - 1 do
szBuff[i] := lpstr[i];
szBuff[count] := #0;
CopyMemory(Result, @szBuff[0], count); {}
end;
end.
Делай так:
program Project2;
uses
Windows,
Unit1 in 'Unit1.pas';
var
a, b : PChar;
count : cardinal;
begin
a := '0123456789';
count := 3;
b := VirtualAlloc(nil, count, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
b := za_copy(a, 0, count);
messagebox(0, b, 'info', 0);
VirtualFree(b, 0, MEM_RELEASE);
end.
Толь что делает твоя za_copy? Попробуй передеть ей Index <> 0 и посмотри,ч то будет... Я вот переделал её для копирования из строки Count символов начиная с Index:
function za_copy(lpStr: PChar; index, count: Cardinal): PChar; stdcall;
var
i : Cardinal;
szBuff : array of Char;
begin
SetLength(szBuff, {lstrlen(lpstr)}Count + 1);
for i := 0 to count - Index do
szBuff[i] := lpstr[i + Index];
szBuff[count] := #0;
CopyMemory(Result, @szBuff[0], count); {}
end;
Ihor Osov'yak (2005-11-06 01:55:00) [6]> Не работает.
Что не работает? Признаки "неработасти"...
> что я делаю не правильно.
Как минимум то, что результат работы za_copy есть указатель на область памяти, которая будет освобождена при выходе из za_copy...
> Спасибо за внимание.
Кушайте на здоровье..