Закон «О санкциях» - это закон о диктатуре и репрессиях в Украине
Dignat
dignatyev
ЗАКОН «О САНКЦИЯХ» - ЭТО ЗАКОН О ДИКТАТУРЕ И РЕПРЕССИЯХ В УКРАИНЕ (С.Кириченко)!

12.08.2014 года Верховная Рада Украины приняла в первом чтении Закон «О санкциях». Само название Закона не раскрывает, против кого именно санкции. Примечательно, что, согласно части 2. статьи 1 санкции применяются Украиной по отношению иностранных государств, иностранных юридических и физических лиц, граждан Украины, юридических лиц, созданных по законодательству Украины, а также ИНЫХ СУБЪЕКТОВ. Это означает, что санкции могут применяться ПРОТИВ ВСЕХ, и ПРОТИВ ЛЮБОГО, как это сочтет орган, применяющий санкции!


КАКИЕ ИМЕННО САНКЦИИ И КТО ИМЕННО ИХ ПРИМЕНЯЕТ?

Виды санкций указаны в статье 4 Закона. Формально это 29 пунктов, но 29-й пункт «без дна», т. е. этот пункт предусматривает «иные (любые) санкции, которые соответствуют принципам их применения, установленным этим Законом».

При этом основным принципом Закона является принцип гарантирования полного осуществления конституционных прав и свобод человека и гражданина путем ограничения, прекращения и запрета осуществления прав и свобод человека и гражданина!

Применять санкции Закон доверяет лишь одному органу, вернее, человеку – ПРЕЗИДЕНТУ УКРАИНЫ, ТАК КАК САНКЦИИ ВВОДЯТСЯ указами Президента Украины на основании решений Совета национальной безопасности и обороны Украины, состав которого из нескольких министров формирует все тот же Президент Украины.

ЗА ЧТО ВВОДЯТСЯ САНКЦИИ?

Основаниями для применения санкций, согласно статье 3 Закона, являются действия любого государства, организации или человека, которые создают, как «реальные, так и кажущиеся угрозы интересам, безопасности и территориальной целостности Украины, ее экономической самостоятельности или нарушают права и свободы человека и гражданина, интересы общества и государства, приводят к оккупации территории, экспроприации или ограничения прав собственности, причинения имущественного ущерба, создания препятствий для устойчивого экономического развития».

Раз власть в Украине в руках государства олигархов, то и санкции вводятся за любые угрозы их интересам и правам правящих миллиардеров.

Если в 20-х и 30-х годах прошлого столетия в СССР санкции (репрессии) проводились через сокращенную судебную процедуру «троек», то Закон «О санкциях» вообще исключает механизм судебной защиты. Обжаловать санкции и указы Президента, вводимые ими, Закон права никому не дает! Хотя ст.124 Конституции Украины определяет, что «правосудие в Украине осуществляется исключительно судами, а ДЕЛЕГИРОВАНИЕ ФУНКЦИЙ СУДОВ, присвоение этих функций иными органами или должностными лицами НЕ ДОПУСКАЕТСЯ».

А РАЗВЕ КОНСТИТУЦИЯ УКРАИНЫ ПОЗВОЛЯЕТ ТАК ПРИМИТИВНО ПРОСТО УЗУРПИРОВАТЬ ВЛАСТЬ В ПОЛЬЗУ ОДНОГО ЧЕЛОВЕКА?

В принципе, НЕТ! Согласно ст.64 Конституции Украины: «Конституционные права и свободы человека и гражданина не могут быть ограничены, кроме случаев, предусмотренных Конституцией Украины.

В условиях военного или чрезвычайного положения могут устанавливаться отдельные ограничения прав и свобод с указанием срока действия этих ограничений. Не могут быть ограничены права и свободы, предусмотренные статьями 24, 25, 27, 28, 29, 40, 47, 51, 52, 55, 56, 57, 58, 59, 60, 61, 62, 63 этой Конституции».

А ВВЕДЕНЫ ЛИ В УКРАИНЕ ВОЕННОЕ ИЛИ ЧРЕЗВЫЧАЙНЫЕ ПОЛОЖЕНИЯ? НЕТ! НЕ ВВЕДЕНЫ.

Значит, отсутствуют основания ограничивать (приостанавливать, прекращать) такие права, которые, например, гарантированы статьями 40, 55, 56, 62, 63 Конституции Украины. Речь идет о праве направлять индивидуальные или коллективные обращения органам власти и их должностным лицам (ст.40); обращаться в суды за защитой своих прав и праве обжалования в суде решений, действий и бездеятельности органов государственной и местной власти, их должностных лиц, обращаться к Уполномоченному по правам человека и в международные суды (ст.55), праве требовать возмещения ущерба за счет государства, причиненного незаконными решениями органов государственной и местной власти, действиями их чиновников (ст.56); праве быть обвиненным в чем-либо лишь обвинительным приговором суда, когда обвинения не могут основываться на доказательствах, добытых незаконным путем, а также на предположениях (ст.62); праве на защиту (ст.63).

Перечисленные права и свободы НЕ МОГУТ БЫТЬ ОГРАНИЧЕНЫ ДАЖЕ ПРИ ВОЕННОМ ИЛИ ЧРЕЗВЫЧАЙНОМ ПОЛОЖЕНИИ! Но Закон «О санкциях» не просто ограничивает людей и организации в этих правах, А ЛИШАЕТ ИХ ЭТИХ ПРАВ!

ТАК КАК НАЗВАТЬ РЕЖИМ ПРАВЛЕНИЯ И РЕЖИМ ВЛАСТИ, ПОЗВОЛЯЮЩИЕ СЕБЕ ТАКОЕ? РЕАКЦИОННЫЙ РЕЖИМ РЕПРЕССИВНОЙ ВЛАСТИ.

Принятие Закона «О санкциях», которое готовят на 14.08.2014 года, и есть сигнал и само начало реакции, репрессий в Украине. Если этого не делать действующей власти, то народ Украины очень быстро сметет такую власть! Лишь страхом, силой, насилием и жестокостью можно оттянуть момент времени свержения олигархов и установления справедливого народовластия. Все зависит от народа.

Майданы Украины 2013-2014 годов требовали обобрать власть у олигархов и передать ее народу. В результате, власть оказалась у ОДНОГО ОЛИГАРХА, от которого зависят судьбы ОСТАЛЬНЫХ ОЛИГАРХОВ и народа Украины!

Значки вконтакте
Dignat
dignatyev
Коды http://emoji-vk.tk/

½ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞
← ↑ → ↓ ↔ ↕ ⇐ ⇒
♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓
☀ ☁ ☂ ☃ ☼ ☽ ★ ☆ ☾ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰
♔ ♕ ♖ ♗ ♘ ♙ ♙ ♚ ♛ ♜ ♝ ♞ ♟
♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧
♰ ♱ ♲ ♳ ♴ ♵ ♶ ♷ ♸ ♹ ♺ ♻ ♼ ♽
♩ ♪ ♫ ♬ ♭ ♮ ♯ ◄◄ ◄ ■ ► ►►
☺ ☻ ッ ヅ ツ ゾ シ ジ
✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧
✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ● ❍ ■ ❏
➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾
۩ ۞ ۩ ✖ † ● • ˜ ° ღ ஐ █ ♂ ▄▀▄▀▄ ψ ⚠ ☎ ☏ ⊇
ॐ ◘ ♀ ▄ ™ ๑ ۩ ۞ ¤ ® ╡ ╬ ┼ √ ╪ ═ ¹ ๖ۣۜG ¯ ⊆ ☦
☨ ☦
₪ ▼ ℮ ਠ ▲ ̃ ఋ ഊ ๑ ○ ± ╞ § ╚ ╣ ₣ Σ Ω ϟ Ŧ ☥
¢ ø ¶ ◄ ╔ ╦ ╟ ╩ ﻸ の ║ ن ╝ ╗ א ◙ 、 ☜ ☞ ʎ ▿ இ ㋛ 〄
❖ � ک ✿ ↨ ∆ ۵ ☠ ⋆ ³ º ❤ ‰ Џ ȋ þ Ђ Þ Ł ł ξ
さ む ░ ▒ ▓ ٭ ր ┘ ┌ Գ ‼ ▌ ∟ ハ ≈ ① ֆ ☢ ☣ ☹ Ѡ ☸ ✆ ☏
∆ ∑ ∫ ■ □ ▪ ▫ ▬ ◊  ☭ Ѽ Ⓐ ➳ ❤ ❣ ❢ ఞ ✂ ✉
✔ ✓ ☐ ☑ ☒ ✪ ★ ☆ 〠 ☯ ☮ ☄ ☊ ☣ ☤ ☬ ☫ ☪ ☧ ❦ ❧ ♨

Ритуалы по всей Украине.
Dignat
dignatyev
Снос памятников Ленина по Украине проходит по ритуальному сценарию.

Сначала вокруг памятника устраивают некоторое представление, потом его роняют, а потом через некоторое время в этом городе погибает определенное количество людей из разных лагерей противостояния. Так было в Киеве, в некоторых восточных городах Украины и даже в Крыму.

Как правило народ доводят до такого состояния, что он сам друг друга убивает. А если люди этого не хотят, то им в этом помогают. Так было сделано в Киеве, когда неизвестные снайперы стреляли как беркутовцев так и революционеров. Даже в Крыму назначили противников друг другу и снайпер застрелил по одному с каждой "противоборствующей" стороны.

Что-то у заправил переворота Украины не идет. Один из самых спокойных городов - это Херсон. Здесь хунта поменяла власть, сидит на финансовых источниках, а народ спит. Чего им не хватает? Они раскачивают смуту, нагнетают обстановку, ищут себе врага. После каждого митинга вечером можно прочитать лживые новости каждой из сторон, где друг друга обсырают, а свои дела возвеличивают. Складывается впечатление, что пророссийские силы не такие уж и пророссийские.

Видимо нужна опять кровь, чтобы завершить ритуал. Если не получится натравить людей опять друг на друга, то возможно, опять появится неизвестный снайпер. Только как бы не получилось, но результата от этого не будет. И пусть заправилы не прибывают в иллюзиях, те механизмы, что существовали раньше - сейчас не работают. Мир поменялся. Так уж сложено, что паразитам и им пособникам уготована судьба, что их сатанинские действия только ускоряют вымирание ихнего рода. А род человеческий будет только рассветать и жить в божьем промысле.

282 статья РФ и присоединение Украины
Dignat
dignatyev
Перспективы вхождения Украины в Российскую Федерацию.

В России много хороших законов, например ограничивающих употребление алкоголя, но есть античеловеческие законы - 282 статья уголовного кодекса «разжигание межнациональной розни» и более раскрученная ювенальная юстиция.

Получается, что действия любого активного жителя Украины, в случае присоединения ее к РФ попадают под статью 282. Это касается как Правого Сектора, так и пророссийски настроенных граждан.

У Украины была возможность войти в Таможенный Союз. При этом она была бы частично экономически зависима от России, но достаточно политически свободна. Старая и новая власти на Украине просрали эту возможность. Теперь нас ждет поглощение Россией, вопрос лишь времени.

Независимо от того, что думает Путин, российские жиды спят и видят как отобрать у украинских жидов новые территории, чтобы паразитировать на местном населении. И для того, чтобы народ молчал придумали репрессивные механизмы типа 282 статьи.

Согласно этому закону нельзя будет жидов называть жидами и нельзя будет говорить правду, отстаивая интересы славян.

Так, что если предложат референдум о вхождении в Российскую Федерацию – несколько раз подумайте об этом, есть ли смысл менять шило на мыло.

юдиф

Трижды экстремист  Л.Н.Толстой

Секреты манипуляции Алкоголь
Dignat
dignatyev

Бездетные трутни
Dignat
dignatyev
Сегодня раздумывал про ту частью общества, которая не создает семьи и не воспитывают детей, хотя имеют для этого все возможности. Анализировал об полезности их для общества и для государства в котором они живут. И пришел к выводу, что в целом это бесполезные люди.

Уточню некоторые моменты. В краткосрочной перспективе, а это в возрасте 20-40 лет, бездетный человек или семья может быть полезен для государства. Он обычно больше работает, больше платит налогов, тем самым помогая государству в социальных программах. В первую очередь это медицина, образование и пенсия для стариков. Также бездетный человек реже пользуется социальной помощью, например, пособием при рождении ребенка. Вроде бы красиво выглядит до поры до времени.

Приходит время и любой гражданин выходит на пенсию. Неважно по какой причине, по возрасту или состоянию здоровья.
И вот тут он из кормильца превращается в иждивенца. Все бы хорошо, но средств у государства чтоб содержать столько пенсионеров, в нужном количестве нет. А точнее пенсии платятся за счет налогов работающего молодого поколения, которого из года в год становится меньше.  И им кроме того, что нужно кормить своих родителей, так еще и кормить бездетных пенсионеров, которые в свое время не обременялись проблемами по воспитанию детей.

Потом государство повышает налоги, увеличивает возраст с которого можно выйти на пенсию. А некоторые страны пошли еще дальше, заселяют свои города иммигрантами со стран, где нет проблем с рождаемостью. В итоге, бездетная беззаботная  жизнь в таких больших масштабах приводит к экономическим и социальным проблемам. 

Надо менять политику государства в вопросе деторождения и воспитания. Например, больше привилегий для родителей и меньше для бездетных. Для страны с более капиталистическим укладом необходимо подойдет разный механизм налогообложения. То есть, для первых - налоги меньше, для вторых - налоги выше. Для социально ориентированных стран подойдет разное количество дней отпуска и так далее. А для "демократических" стран - я бы не давал право голоса, пока в семье нет детей. Кстати это очень удобно, если не созрела иметь детей - значит тебе рано голосовать и влиять на судьбы других граждан.

Быстрый WideString
Dignat
dignatyev

 

Быстрый WideString

 

Как ускорить производительность операций с WideString в Delphi?

 

1. Теория.

 

В Delphi есть удобный механизм для работы со строковыми данными. Для этого есть несколько типов строковых переменных: AnsiString, WideString и UnicodeString. Они удобны тем, выполняя операции присваивания и конкатенации, компилятор за нас сам выделяет или освобождает память под строки, а также автоматически преобразует один тип данных в другой.

AnsiString и UnicodeString – это внутренний формат представления строки в Delphi. Для выделения памяти под строку используется собственный очень производительный менеджер памяти. Также при копировании строк используется подсчет ссылок, без перераспределения памяти. Таким образом, компилятор генерирует максимально производительный код.

WideStringэто неявный формат BSTR и является стандартным строковым типом в COM/DCOM. Это его основное достоинство. Недостатком является отсутствие подсчета ссылок. Компилятор неявно использует API-функции при операциях с данными этого типа. Поэтому операции с WideString очень медленны.

По ряду объективных причин многие проекты пишутся на старых версиях Delphi, в которых нет быстрых UnicodeString. А поддержка юникода необходима, вот и приходится использовать WideString.

 

2. Практика.

Организуем в WideString поддержку подсчета ссылок, так чтоб и нашей программе было хорошо и объектам COM/DCOM в нашем приложении. Компилятор – Delphi 2007.

Для этого необходимо подменить ряд функций в system.pas. И самим выделять память, копировать и уничтожать строковые данные. Достаточно будет таких функций:

function _NewWideString(CharLength: Longint): Pointer;
procedure _WStrClr(var S);
procedure _WStrArrayClr(var StrArray; Count: Integer);
procedure _WStrAsg(var Dest: WideString; const Source: WideString);
procedure _WStrLAsg(var Dest: WideString; const Source: WideString);
procedure _WStrFromPWCharLen(var Dest: WideString; Source: PWideChar; CharLength: Integer);
procedure _WStrFromWChar(var Dest: WideString; Source: WideChar);
procedure _WStrFromPWChar(var Dest: WideString; Source: PWideChar);
function _WStrAddRef(var str: WideString): Pointer;

Можно конечно вписать в них свой код и откомпилировать system.pas, но пойдем более универсальным путем. Выполним перехват этих функций.
Для совместимости с COM/DCOM также перехватим:

function SysAllocString(psz: POleStr): TBStr; stdcall;
procedure SysFreeString(bstr: TBStr); stdcall;
function SysReAllocString(var bstr: TBStr; psz: POleStr): Integer;
function SysAllocStringLen(psz: POleStr; len: Integer): TBStr;
function SysReAllocStringLen(var bstr: TBStr; psz: POleStr; len: Integer): Integer;
function SysAllocStringByteLen(psz: PChar; len: Integer): TBStr; stdcall;


В WideString есть структура, в ней хранится длина строки в байтах. Эта структура размещена в памяти непосредственно перед данными строки. Создадим свою структуру, в которой кроме длины будем хранить счетчик ссылок и специальный идентификатор, чтоб отличать наши строки от всех прочих юникодных строк. Думаю, что длины в 12 байт вполне хватит для идентификатора.


type
  PWideStr = ^TWideStr;

  TWideStr = record

    refcnt : integer; //счетчик ссылок

    id0    : integer; //наш идентификатор

    id1    : integer; //наш идентификатор

    id2    : integer; //наш идентификатор

    length : integer; //размер строки (как и положено)

end;

const
  size_str = sizeof(TWideStr); 

  str_id_0 = integer($96969696);

  str_id_1 = integer($75757575);

     str_id_2 = integer($38383838);
 

Инициализации строки
function doWStrAlloc(len: Integer): PWideStr; inline;
begin
  GetMem(result, size_str + len + 2);
  result.refcnt := 1;
  result.Id0 := str_id_0;
  result.Id1 := str_id_1;
  result.Id2 := str_id_2;
  result.length := len;
  PWideChar(@PAnsiChar(result)[size_str+len])^ := #0;
end;

 Освобождение строки

procedure doWStrFree(s: PWideStr); inline;
begin
  if (s.Id2 = str_id_2) and
     (s.Id1 = str_id_1) and
     (s.Id0 = str_id_0)
  then
  if InterlockedDecrement(s.refcnt) = 0 then
  FreeMem(s);
end;

 procedure WStrFree(s: PWideStr); inline;
begin

  if Assigned(s) then begin

    Dec(s);

    if (s.Id2 = str_id_2) and

       (s.Id1 = str_id_1) and

       (s.Id0 = str_id_0)

    then

    if InterlockedDecrement(s.refcnt) = 0 then

    FreeMem(s);

  end;

end;


Копирование строки

function doWStrCopy(s: PWideStr): PWideStr; inline;
begin
  if (s.Id2 = str_id_2) and
     (s.Id1 = str_id_1) and
     (s.Id0 = str_id_0)
  then begin
    InterlockedIncrement(s.refcnt);
    result := s;
  end
  else begin
    result := doWStrAlloc(s.length);
    Move(PAnsiChar(s)[size_str], PAnsiChar(result)[size_str], s.length);
  end;
end;

 function WStrCopy(s: PWideStr): PWideStr; inline;
begin

  if s = nil then

    result := nil

  else begin

    Dec(S);

    if (s.Id2 = str_id_2) and

       (s.Id1 = str_id_1) and

       (s.Id0 = str_id_0)

    then begin

      InterlockedIncrement(s.refcnt);

      result := @PAnsiChar(s)[size_str];

    end

    else begin

      result := @PAnsiChar(doWStrAlloc(s.length))[size_str];

      Move(PAnsiChar(s)[size_str], result^, s.length);

    end;

  end;

end;


function WStrLCopy(s: PWideStr; len: integer): PWideStr; inline;
begin

  result := doWStrAlloc(len);

  Inc(result);

  if Assigned(s) then

    Move(s^, result^, len);

end;


А вот процедуры для подмен (system.pas)

function xWStrClr(var S: PWideStr): PWideStr;
begin
  result := @S;
  WStrFree(s);
  S := nil;
end;

procedure xWStrAsg(var Dest: PWideStr; Source: PWideStr);
var

  t   : PWideStr;

begin

  t := Dest;

  if t <> Source then begin

    WStrFree(t);

    if Source = nil then

      Dest := nil

    else begin

      Dec(Source);

      t := doWStrCopy(Source);

      Dest := @PAnsiChar(t)[size_str];

    end;

  end;

end;


function xWStrAddRef(var s: PWideStr): Pointer;
begin

  result := WStrCopy(s);

end;


procedure xWStrArrayClr(s: PPWideStr; Count: Integer);
var

  t : PWideStr;

begin

  while Count > 0 do begin

    t := s^;

    WStrFree(t);

    Inc(s);

    Dec(count);

  end;

end;


 

procedure xWStrFromPWCharLen(var Dest: PWideStr; Source: PWideStr; Len: Integer);
begin

  WStrFree(Dest);

  Dest := WStrLCopy(Source, Len*2);

end;
 

procedure xWStrFromWChar(var Dest: PWideStr; Source: WideChar);
var

  t : PWideStr;

begin

  if (Dest = nil) or (PWideChar(Dest)^ <> Source) then begin

    WStrFree(Dest);

    t := doWStrAlloc(2);

    Inc(t);

    Move(Source, t^, 2);

    Dest := t;

  end;

end;


 

procedure xWStrFromPWChar(var Dest: PWideStr; Source: PWideStr);
var

  t : PWideStr;

begin

  t := WStrLCopy(Source, WStrSize(PWideChar(Source)));

  WStrFree(Dest);

  Dest := t;

end;

function xNewWideString(Len: Longint): PWideStr;
begin

  result := doWStrAlloc(Len*2);

  Inc(result);

end;


Процедуры для подмен (oleaut32.dll)

procedure xSysFreeString(s: PWideStr); stdcall;
begin
  WStrFree(s);
end;

 function xSysAllocString(s: PWideStr): PWideStr; stdcall;
begin

  result := WStrLCopy(s, WStrSize(PWideChar(s)));

end;
 

function xSysAllocStringLen(s: PWideStr; len: Integer): PWideStr; stdcall;
begin

  result := WStrLCopy(s, len * 2);

end;

 function  xSysAllocStringByteLen (s: pointer; len: Integer): PWideStr; stdcall;
begin

  result := WStrLCopy(s, len);

end;

 function xSysReAllocStringLen(var p: PWideStr; s: PWideStr; len: Integer): LongBool; stdcall;
begin

  if s <> p then begin

    WStrFree(p);

    p := WStrLCopy(s, len * 2);

  end;

  result := true;

end;
 

Перехватывать функции будет методом сплайсинга. Это когда в начало кода перехватываемой функции вставляем переход на нашу функцию. Обычно это команда jmp offset.

 type
  POffsJmp = ^TOffsJmp;
  TOffsJmp = packed record

    code : byte;     //$E9

    offs : cardinal;

  end;

 procedure HookCode(Src, Dst: pointer); inline;
begin

  if Assigned(Src) then begin

    poffsjmp(Src).code := $E9;

    poffsjmp(Src).offs := cardinal(Dst) - cardinal(Src) - 5;

  end;

end;


procedure HookProc(handle: cardinal; Name: PAnsiChar; Hook: pointer); inline;
begin

  HookCode(GetProcAddress(handle, Name), Hook);

end;

 Так мы узнаем адреса функций в system.pas:


function pWStrClr: pointer;
asm

  mov eax, OFFSET System.@WStrClr

end;

function pWStrAddRef: pointer;
asm

  mov eax, OFFSET System.@WStrAddRef

end;

 
function pWStrAsg: pointer;

asm

  mov eax, OFFSET System.@WStrAsg

end;

function pWStrLAsg: pointer;
asm

  mov eax, OFFSET System.@WStrLAsg

end;

function pWStrArrayClr : pointer;
asm

  mov eax, OFFSET System.@WStrArrayClr

end;
 

function pWStrFromPWCharLen : pointer;
asm

  mov eax, OFFSET System.@WStrFromPWCharLen

end;
 

function pWStrFromWChar : pointer;
asm

  mov eax, OFFSET System.@WStrFromWChar

end;

 function pWStrFromPWChar : pointer;
asm

  mov eax, OFFSET System.@WStrFromPWChar

end;

 function pNewWideString : pointer;
asm

  mov eax, OFFSET System.@NewWideString

end;
 

Код перехвата.

procedure FastWideStringInit;
var
  handle  : cardinal;
  protect : cardinal;
  mem     : TMemoryBasicInformation;
begin
  VirtualQuery(pWStrAddRef, mem, sizeof(mem));
  VirtualProtect(mem.AllocationBase, mem.RegionSize, PAGE_EXECUTE_READWRITE, protect);
  HookCode(pWStrClr,           @xWStrClr);
  HookCode(pWStrAsg,           @xWStrAsg);
  HookCode(pWStrLAsg,          @xWStrAsg);
  HookCode(pWStrAddRef,        @xWStrAddRef);
  HookCode(pWStrArrayClr,      @xWStrArrayClr);
  HookCode(pWStrFromPWCharLen, @xWStrFromPWCharLen);
  HookCode(pWStrFromWChar,     @xWStrFromWChar);
  HookCode(pWStrFromPWChar,    @xWStrFromPWChar);
  HookCode(pNewWideString,     @xNewWideString);
  VirtualProtect(mem.AllocationBase, mem.RegionSize, protect, protect);
 

  handle := GetModuleHandle(oleaut);
  if handle = 0 then

    handle := LoadLibrary(oleaut);

  VirtualQuery(GetProcAddress(handle, 'SysAllocString'), mem, sizeof(mem));
  VirtualProtect(mem.AllocationBase, mem.RegionSize, PAGE_EXECUTE_READWRITE, protect);

  HookProc(handle, 'SysAllocString',        @xSysAllocString);

  HookProc(handle, 'SysAllocStringLen',     @xSysAllocStringLen);

  HookProc(handle, 'SysAllocStringByteLen', @xSysAllocStringByteLen);

  HookProc(handle, 'SysReAllocStringLen',   @xSysReAllocStringLen);

  HookProc(handle, 'SysFreeString',         @xSysFreeString);

  VirtualProtect(mem.AllocationBase, mem.RegionSize, protect, protect);

end;

 


 

3. Тестирование.

 

Для тестирования возьмем объект TWideStringList из WideStrings.pas. У него есть свойство

property Text: WideString read GetTextStr write SetTextStr. Если присвоить ему текст большого размера, то получим представление об увеличении производительности. Для этого я загрузил в память содержимое файла windows.pas и засек время,необходимое для выполнения GetTextStr () и SetTextStr(). Тестировал до и после инициализации быстрых WideString.


Прирост скорости составил 80 % от начального. Достаточно заметно.


const
  rep_count := 40;


procedure TestWideString(var s: widestring);
var

  i : integer;

begin

  with TWideStringList.Create do

  try

    for i := 0 to rep_count do begin

      Text := s;

      s := Text;

    end;

  finally

    Free;

  end;

end;

 
 

4. Подводные камни.


 

Многие программисты знают, что при копировании WideString, под новую строку выделяется новая память. Поэтому они могут свободно модифицировать содержимое новой строки, не боясь, что это повлияет на первоначальную строку.

 

Рассмотрим следующий пример.

 const
  shlwapi32 = 'SHLWAPI.DLL';


function PathRemoveFileSpecW(pszPath: PWideChar): BOOL; stdcall; external shlwapi32; 

function PathRemoveFileSpec(s: WideString): WideString;
begin

  result := s;

  if PathRemoveFileSpecW(PWideChar(result)) then

    result := PWideChar(result);

end;

var
  a : widestring;

  b : widestring;

begin

  a := 'c:\myfolder\myfile.txt';

  b := PathRemoveFileSpec(a);

end;


Функция PathRemoveFileSpecW() если удачно отработает, модифицирует строку 'c:\myfolder\myfile.txt'  на 'c:\myfolder'#0'myfile.txt';  В итоге переменная b будет равна 'c:\myfolder' А переменная a, как была 'c:\myfolder\myfile.txt',  так и осталась. То, что мы ожидали увидеть.


В случае с включенным режимом подсчета ссылок при присваивании result := s, переменные result, s и а ссылаются на одну и ту же память со строкой. При присваивании у нас всего лишь увеличился счетчик ссылок. Что же произойдет после выполнения функции PathRemoveFileSpecW()? Она модифицирует одну и туже строку, на которую ссылаются все эти переменные. В итоге b = 'c:\myfolder', а = 'c:\myfolder'#0'myfile.txt'. Вот это мы не ожидали. Если значение переменной a использовать в дальнейших операциях, то это приведет к непредсказуемым результатам.


Как тут быть? Да очень просто. Нужно копировать полностью строку, например вот так: b := PathRemoveFileSpec(a + '') или result := s + ''. Такая инструкция заставит компилятор сгенерировать код, который полностью копирует строку.

function PathRemoveFileSpec(s: WideString): WideString;
begin
  result := s + '';
  if PathRemoveFileSpecW(PWideChar(result)) then
    result := PWideChar(result);
end;

Так как подобные случаи не так часто встречаются, то найти и подправить нужный код проекта не составит труда.


 

5. Исходные коды.

 


 

 


?

Log in