Náhodné výkřiky 21

vložil Radek Červinka 23. ledna 2012 23:12

Dnes PDF komponenta, kousek kódu, trochu háčků, něco o flash a skoro žádný OT. A ani slovo o FreeAndNil.

PDF to Text

Analyzoval jsem, zda neexistuje rozumné řešení za rozumnou cenu jak z PDF dostat text v češtině. Nakonec jsem jednu knihovnu našel: PDFtext od pdf-analyzer.com nabízí DLL za US$ 57,00,které podle mne funguje a vrátí v UTF8 opravdu reálný a správný český text. Ke stažení demo.

TArray

TArray je deklarováno v system.pas jako

  TArray<T> = array of T;

tj. jako generické pole typu T.

V System.Generics.Collections je pak deklarována třída, která umožňuje řazení, vyhledávání (i s případným vlastním porovnávačem) atd.

uses
  System.SysUtils,
  System.Generics.Collections;

var
  ar: TArray<integer>;
  i: Integer;
begin
  SetLength(ar, 10);
  for i := 0 to High(ar) do
    ar[i] := random(100);
  TArray.Sort<integer>(ar);
  for i := 0 to High(ar) do
    writeln(ar[i], ', ');
end.

Virtual method interception

Předminule jsem tu odkazoval DORM a TMS Aurelius. Barry Kelly popsal novinku v Delphi XE, kdy pomocí RTTI lze šachovat s virtuálními metodami - ideální pro remoting. Nepochybuji, že to uvedené knihovny používají. Mimochodem, kdysi dávno jsem tu v rámci série háčků (tj. nečestných a nesportovních zásahů do kódu) popsal nahrazení virtuální metody cizí třídy. Nyní uvedený kód je výrazně čistější.

Pozor na háčky

Mimochodem ty háčky jsou celkem prasárna. Pokud někomu dodáváte např. DCU a spoléháte se, že stačí zobrazit nějaký messagebox po startu a nejlépe na to máte nějakou globální proceduru typu ShowTrial, tak se nedivte až Vám to někdo za běhu hackne aby ušetřil. Stačí to krokovat, zjistit kde se to vypisuje a pak napsat něco jako

uses
  vasunit;

var
  p: pointer;
  b: byte;
  n: DWORD;

initialization

    b := $C3;    // RET
    p := GetActualAddr(@vasunit.ShowTrial);
    WriteProcessMemory(GetCurrentProcess, p, @b, 1, n);

finalization
end.

Kde GetActualAddr je funkce z těch háčků, vrací adresu funkce @vasunit.ShowTrial. No a pak jen stačí pomocí WriteProcessMemory napsat na její začátek RET. Přitom by stačilo tak málo, třeba pro začátek použít inline. To to řádově ztíží - zvláště pokud je to použité na více místech. Samozřejmě takto můžete za běhu patchnout cokoliv, většinou se dá nějaký ten CALL za běhu najít nebo dopočítat. Takže pozor na to!

No, dekompilaci Delphi programů jsem se již věnoval, takže laskavý čtenář už určitě zná některé triky a čemu se vyhnout.

Adobe ukončilo vývoj flash pro mobily

Cha, tak to Adobe vzdal - ukončil vývoj nových verzí flash pluginu pro mobilní zařízení. Ve prospěch nativních aplikací s Adobe AIR. Takže Steve nakonec vyhrál když odmítal flash na iPhone.

No není to poprvé kdy v poslední době je nahrazován "managed" platforma za nativní.

P.S.: Dneska nebude žádná oftopinka, jelikož jediné co by stálo za řeč je odkaz od Andreano Lanusse shrnující jak Android, resp. google uhnul z původního dobrého konceptu od sloupkaře techcrunch.com, případně jak se aktuálně InstallAware rozkmotřilo s Embarcaderem, ale ani jedno za to nestojí (v prvním případě bych riskoval možnou inzultaci, v druhém případě si nejsem jist kam to povede - ale dle wiki slibovaný update 4 má být full install, tak to třeba souvisí).


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: , , ,

Komentáře

26.1.2012 10:13:49 #

JaroB.

Kdysi dávno jsem používal zajímavou komponentu tnpdf. Ve skutečnosti je to komponenta na principu unity Printer. Neuvěřitelně jednoduché a přitom jsou PDF krásně čitatelné (neumí embeded fonty, takže unikód může být problém, ale dají se tam strkat obrázky). Pro generování např. denních výpisů o telefonních hovorech nebo fakturace či účtenky, no paráda. Tady je původní odkaz na Torry:   http://www.torry.net/quicksearchd.php?String=TNPDF&Title=No

JaroB.

27.1.2012 1:25:00 #

Tomas Hruska

Ciste ze zvedavosti: proc u vypisu TArray nepouzijete for in cyklus? Zvyk, nebo neco hlubsiho?

Tomas Hruska

27.1.2012 1:32:08 #

Radekc

Protože jsem zkopíroval to plnění a jen to upravil :-)

Radekc

27.1.2012 2:15:30 #

Tomas Hruska

To me zase napadlo, jestli by to neslo i opacne - tedy plnit pres for in - ale byla to samozrejme hloupost  ...

Tomas Hruska

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS