Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Подскажите пожалуйста, что я делаю не правильно.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.059 c
3-1128954616
Juice
2005-10-10 18:30
2005.11.20
ClientDataSet не синхрон. с TSQLDataSet


14-1130330554
Вопрошающий
2005-10-26 16:42
2005.11.20
задачка


4-1125087389
eselista
2005-08-27 00:16
2005.11.20
Перенаправить на порт


14-1130749014
Который Барлог
2005-10-31 11:56
2005.11.20
Вирус? :)


2-1130694384
JBL
2005-10-30 20:46
2005.11.20
dbGrid