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

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

Подскажите пожалуйста, что я делаю не правильно. [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...

> Спасибо за внимание.
Кушайте на здоровье..


Наверх

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