Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизПодскажите пожалуйста, что я делаю не правильно. Найти похожие ветки
← →
zaN0za © (2005-11-06 01:20) [0]доброго времени суток, уважаемые мастера.
вопрос такой:
есть модуль:
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.
Не работает. Подскажите пожалуйста, что я делаю не правильно.
Спасибо за внимание.
← →
Ihor Osov'yak © (2005-11-06 01:55) [1]> Не работает.
Что не работает? Признаки "неработасти"...
> что я делаю не правильно.
Как минимум то, что результат работы za_copy есть указатель на область памяти, которая будет освобождена при выходе из za_copy...
> Спасибо за внимание.
Кушайте на здоровье..
← →
gdaujk © (2005-11-06 02:18) [2]
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;
← →
gdaujk © (2005-11-06 02:27) [3]Вроде лучше, чтоб Index + Count было менше lstrlen(lpstr)... Но почему-то и в этом случае всё работает???
← →
Набережных С. © (2005-11-06 09:25) [4]
> MEM_COMMIT or MEM_RESERVE
Оригинально!:)
← →
gdaujk © (2005-11-06 11:05) [5]gdaujk © (06.11.05 02:18) [2]
Много ошибок, исправляйте сами...
Набережных С. © (06.11.05 09:25) [4]
Ваша правда, можно и без MEM_RESERVE.
← →
Набережных С. © (2005-11-06 11:48) [6]
> gdaujk © (06.11.05 11:05) [5]
Я бы даже рискнул сказать "нужно". В соответствии с документацией. И тот факт, что текущая реализация VirtualAlloc "проглатывает" эту несуразицу, ничего не меняет.
ЗЫ. Поставляемый с Delphi Win32SDK.hlp - фтопку.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c