Autor Téma: Čtení DLL - chyba  (Přečteno 6226 krát)

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Čtení DLL - chyba
« kdy: 23-01-2016, 05:49:38 »
zdravím,
můžete mi prosím poradit?
- přes klik button volám funkci, která dynamicky čte dll a přes jeho funkci vrací string
- vše je ok do doby, než v proceduře button klik odremuji řádek JvMemo1.Lines.Clear; (který s dll nemá nic společného).
pak program padne na error ReadAddress 00000000.

Co je špatně? Díky moc.

Kód: Delphi [Vybrat]
  1. implementation
  2.  
  3. type
  4.   TExtractTextFunc = function (lpFileName: WideString;
  5.                                bProp: BOOL;
  6.                                plpFileText: PWideString): Integer; stdcall;
  7.  
  8. {$R *.dfm}
  9.  
  10. procedure TForm1.btn1Click(Sender: TObject);
  11. var wStr : String;
  12. begin
  13.  
  14.     wStr := PDFtoString('test.pdf');
  15.     //JvMemo1.Lines.Clear;
  16. end;
  17.  
  18. function TForm1.PDFtoString(const aFileName: string): string;
  19. var
  20.   DllHandle    : THandle;
  21.   ExtractarFunc: TExtractTextFunc;
  22.   OutText      : String;
  23.   wStr                  : string;
  24. begin
  25.    Result := '';
  26.    DllHandle := LoadLibrary('xd2txlib.dll');
  27.  
  28.    if DllHandle < HINSTANCE_ERROR then begin
  29.       ShowMessage('Chybí DLL pro konverzi PDF (xd2txlib.dll)');
  30.       exit;
  31.    end;
  32.    try
  33.       @ExtractarFunc := GetProcAddress(DllHandle, 'ExtractText');
  34.       if @ExtractarFunc = nil then exit;
  35.       ExtractarFunc( aFileName, false, @OutText);
  36.       Result:= OutText;
  37.    finally
  38.       ZeroMemory(@OutText, SizeOf(OutText));
  39.       FreeLibrary(DllHandle);
  40.    end;
  41. end;
  42.  
  43.  

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Čtení DLL - chyba
« Odpověď #1 kdy: 23-01-2016, 06:55:37 »
Samozřejmě těžko říct na 100%, když nedáváš žádné informace o té funkci ExtractText z DLL, ale podle mě ti v ní dochází buď k buffer overflow nebo k nesprávné alokaci stringu (podle toho, čím byla knihovna zkompilována ve vztahu k tomu, čím byl zkompilován tvůj program). Ta DLL funkce by vůbec neměla používat datový typ string, jejím parametrem by měl být ideálně ukazatel na buffer a velikost tohoto bufferu.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Čtení DLL - chyba
« Odpověď #2 kdy: 23-01-2016, 07:34:05 »
Great
Rated 1 time
  TExtractTextFunc = function (lpFileName: WideString;
                               bProp: BOOL;
                               plpFileText: PWideString): Integer; stdcall;
[...]
  OutText      : String;
[...]
      ExtractarFunc( aFileName, false, @OutText);
[...]
      ZeroMemory(@OutText, SizeOf(OutText));
Spatne je to, ze mezi DLL a aplikaci se neda primo predavat reference counted objekt,
coz tvurce DLL zrejme vedel a proto pouziva WideStringy, zatimco
ty je cpes do Stringu...

Nehlede na to, ze signatura te funkce v DLL vraci data pres buffer
typu PWideString, o jehoz alokaci jsi povinen se postarat.

Nevim, jak je to udelane v te DLL, ale treba na wokennim API
pri volani DLL plati konvence, ze se funkce z DLL vola s buffer=nil
a ona nevraci data, ale jen delku dat, pak se alokuje
buffer o pozadovane velikosti a vola se znovu, tentokrat
s ukazatelem na zacatek alokovaneho bufferu.

Ale konkretni zpusob volani zalezi na te funkci v DLL.
Pokud nepracuje uvedenym zpusobem, musis si naalokovat
hooodne velky buffer, aby se to vlezlo a nikde to nic
neprepsalo a pak pracovat jen s platnou casti
bufferu o delce, kterou pravdepodobne vraci ta funkce.

Pokud mas unicodifikovany Delphi. da se pouzit napr.:
Kód: Delphi [Vybrat]
  1. var
  2.   Buf: string;
  3.   BufLng: integer;
  4. ...
  5. SetLength(Buf,MAX_EXTRACT_TEXT_BUFFER_SIZE);
  6. ...
  7. BufLng := ExtractText(....., @Buf[0]);
  8. SetLength(Buf,BufLng);
  9. ...
  10.  



Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1142
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:Čtení DLL - chyba
« Odpověď #3 kdy: 23-01-2016, 09:50:40 »
A nebylo by jednodušší ten kód (pokud tedy máš zdrojáky) z DLL rovnou přilinkovat k aplikaci?
:)

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Re:Čtení DLL - chyba
« Odpověď #4 kdy: 24-01-2016, 06:56:31 »
Potřebuji dostat text z PDFka, samozřejmě ideálně free komponenta. A co jsem našel "funkčního" bylo tohle dll. Takže zdroje nemám.
Ono to "funguje spolehlivě" v jediném případě: pokud výstup z dll nacpu do  TStrings. Všechno ostatní spadne.

Neznáte nějakou free komponentu na parsování PDF? Žádná kouzla, jen pošlu file a vezmu text.
Díky moc.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Čtení DLL - chyba
« Odpověď #5 kdy: 24-01-2016, 08:27:18 »
Ono to "funguje spolehlivě" v jediném případě: pokud výstup z dll nacpu do  TStrings. Všechno ostatní spadne.
Ono to nefunguje nikdy a vzdycky to prepisuje pamet, jen se to ne vzdy projevuje navenek !!!

Misto nesmyslneho zkouseni to naprogramuj, jak se to naprogramovat ma a jak jsem ti naznacil.
Pokud nejsi zakem obecne skoly, u ktereho by se to dalo jeste tolerovat a nejsi ochoten/schopen
si to nastudovat, tak se na programovani radsi vys*r a jdi delat neco jineho.

Tohle uz se neda ani cist  >:(

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Re:Čtení DLL - chyba
« Odpověď #6 kdy: 24-01-2016, 08:39:56 »
Dělám něco jiného a dělat budu. Programování mám jako koníka, jeho výstupy mi ulehčují práci. Nic víc, nic méně.
Myslel jsem, že tady chytřejší radí méně zdatným. Asi jsem se mýlil. Asi jsem zabrousil na fórum, kde si zdatnější potřebují dokázat, jak jsou na tom ještě lépe než ostatní..

A jestli je to datum v nicku datum narození, tak to je mi Tě líto. Takové vzkazy bych čekal od náctiletého na zive.cz. Jdu studovat. Anebo se na to vys..u. Ještě uvidím. LP 1967.
« Poslední změna: 24-01-2016, 08:41:50 od pospisil.lada »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7392
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Čtení DLL - chyba
« Odpověď #7 kdy: 24-01-2016, 08:49:09 »
Citace
Myslel jsem, že tady chytřejší radí méně zdatným. Asi jsem se mýlil.
Tak to sa nemýliš.
Citace
Asi jsem zabrousil na fórum, kde si zdatnější potřebují dokázat, jak jsou na tom ještě lépe než ostatní..
Takých tu nepoznám.
A na takých ľudí ako je pf1957 tu nesiahaj (neber si ich do úst). Radšej si pozorne prečítaj celú tému niekoľkokrát a potom začni študovať.
PS: ani ja som nedostával iné typy odpovedí. A bol som veľmi vďačný. Tiež amatér samouk a programovanie ako koník. Všimni si akú majú zo mňa srandu. Ja sa neurážam, ale sám sa (po upozornení) na niektorých svojich veciach veľmi pobavím.
« Poslední změna: 24-01-2016, 08:51:27 od Stanislav Hruška »
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1205
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Čtení DLL - chyba
« Odpověď #8 kdy: 24-01-2016, 09:01:00 »
Excellent
Rated 1 time
@lada: Ja jen podotknu, že to je, jako kdyby jsi šel vrtat do zdi vrtákem na dřevo a pak si stěžoval, že to sice funguje, ale dost špatně a ještě se ti kazí vrták.
Dostals odpověď, že máš použít jiný vrták, a ty si stojíš za tím, že ten vrták na dřevo vrtal, jen špatně.

Ještě jednou si přečti odpověď, podívej se na parametry té funkce z DLL a ty správné parametry tam taky dodej. Nezapomeň, že pracuješ s pointerem a je potřeba správně použít stříška P^ ...

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Re:Čtení DLL - chyba
« Odpověď #9 kdy: 24-01-2016, 09:08:54 »
@lada: Ja jen podotknu, že to je, jako kdyby jsi šel vrtat do zdi vrtákem na dřevo a pak si stěžoval, že to sice funguje, ale dost špatně a ještě se ti kazí vrták.
Dostals odpověď, že máš použít jiný vrták, a ty si stojíš za tím, že ten vrták na dřevo vrtal, jen špatně.

Ok, díky.  Ale já si nestojím za svým, já jsem si moc dobře přečetl od pf1957 jak bych na to měl jít. Jen jsem se (asi blbě) zeptal, proč to nepadá na TStrings. Nic víc. Stačilo napsat, že to padá vždycky, jen tady se to holt neprojeví brutálně. To chápu.
Pochopte vy, že ty další kecy akorát odradí ostatní od toho se zeptat, aby se nedejbože zeptali úplně blbě.
..............
pojďme od toho při neděli
..............

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Čtení DLL - chyba
« Odpověď #10 kdy: 24-01-2016, 10:22:28 »
Myslel jsem, že tady chytřejší radí méně zdatným. Asi jsem se mýlil.
Nemýlil. Mýlíš se ve svém přesvědčení, že povinností zdatnějších je řešit problémy za méně zdatné, kteří navíc jnejsou ochotni investovat úsilí do toho, aby se zdatnějšími stali.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1142
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:Čtení DLL - chyba
« Odpověď #11 kdy: 24-01-2016, 10:24:10 »
a zkusil ses podívat třeba sem?
http://stackoverflow.com/questions/3650957/how-to-extract-text-from-a-pdf
nebo sem?
http://stackoverflow.com/questions/4291859/dumping-pdf-document-pdf-to-text
Když už nic, tak to alespoň inspiruje a nasměruje jinam...

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:Čtení DLL - chyba
« Odpověď #12 kdy: 24-01-2016, 10:27:16 »
Jen jsem se (asi blbě) zeptal, proč to nepadá na TStrings.
Dostal jsi odpověď, že to blbne pořád, akorát se to neprojevuje tak, abys to rozpoznal. Třeba proto, že TStringList si naalokuje nějakou paměť dopředu a shodou okolností je to tolik, že to pro tvoje PDF stačí. Akorát ti pak program padá při uvolňování stringlistu a při použití jiného PDF to nejspíš spadne zase někde jinde.

Citace
Pochopte vy, že ty další kecy akorát odradí ostatní od toho se zeptat, aby se nedejbože zeptali úplně blbě.
Pochop ty, že člověku, který se jenom ptá, a to ještě většinou bez jakékoliv snahy o pochopení problému, jen o jeho vyřešení někým jiným, není příjemné radit. Kdybys někdy sem tam něčím přispěl, nebo kdybys sem tam projevil snahu se vzdělat, tak bys nejspíš dostával příjemnější odpovědi. Protože to neděláš, tak jsi vcelku oprávněně zařazen do kategorie vyžírků, na které nechce nikdo zbytečně marnit čas.

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 141
  • Karma: 8
Re:Čtení DLL - chyba
« Odpověď #13 kdy: 24-01-2016, 13:57:27 »
Myslel jsem, že tady chytřejší radí méně zdatným. Asi jsem se mýlil. Asi jsem zabrousil na fórum, kde si zdatnější potřebují dokázat, jak jsou na tom ještě lépe než ostatní..

Tak nevím, pf1957 ti přesně odpověděl co děláš špatně. ještě ti to rozepsal a stejně si to nepochopil. Programování není o tom, že znáš nějaký jazyk, ale že víš nebo se snažíš pochopit jak to ve skutečnosti funguje. Vzhledem to tomu, že asi netušíš jak vůbec funguje dvojkombinace EXE - DLL a pf1957 to správně odhadl, tak ti to rovnou trochu popsal.

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Re:Čtení DLL - chyba
« Odpověď #14 kdy: 24-01-2016, 14:01:05 »
Díky JaroB za dva linky - asi jsem opravdu blb, ale na ně jsem nenarazil.
A ostatním díky za kamenování.

Offline našinec

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 5

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Re:Čtení DLL - chyba
« Odpověď #16 kdy: 24-01-2016, 19:05:14 »
http://forum.delphi.cz/index.php/topic,14902.msg89826/topicseen.html#msg89826.

já vím, pořád hledám. Ale nic free. Snad jen pdftotext, ale je to spouštění exe souboru přes shellexec..
Ale i tak díky.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3466
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Čtení DLL - chyba
« Odpověď #17 kdy: 24-01-2016, 23:10:12 »
Prosim te nech si ty urazky nekam jinam, tohle opravdu nemíním tolerovat. Ber to jako posledni varovani.
Pf presne popsal odpoved a IMHO naprosto správně a trpělivě a místo vděku takovou drzost.

Radek




A jestli je to datum v nicku datum narození, tak to je mi Tě líto. Takové vzkazy bych čekal od náctiletého na zive.cz. Jdu studovat. Anebo se na to vys..u. Ještě uvidím. LP 1967.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Čtení DLL - chyba
« Odpověď #18 kdy: 25-01-2016, 08:15:18 »
Kdyz jsem vyvolal takovouhle reakci, tak jeste par poznamek:

Pochopte vy, že ty další kecy akorát odradí ostatní od toho se zeptat, aby se nedejbože zeptali úplně blbě.
  • Nevedet je normalni a zeptat se je taky normalni, takze nechapu, kdyz se nekdo chce neco dozvedet, jak se muze nechat odradit  :o
  • Pokud nevis, na jakem principu funguji fora, doporucuji k precteni klasicky material http://www.root.cz/texty/jak-se-spravne-ptat/
  • Ve sve prvni odpovedi jsem zrejme dostatecne nezduraznil, ze prepisujes pamet.
    A prepisovani pameti je vubec ta nejhorsi chyba, kterou programator muze udelat. S dopady tak fatalnimi, ze to vedlo k vytvoreni novych programovacich jazyku jako Java, Python, C# aj., ktere programatorovi sebrali adresaci pameti 2. a vyssiho radu (neprimou adresaci), aby pamet nemohl prepisovat a dnes se v nich pise vetsina programu.
    Pokud ke svoji hobby cinnosti nepotrebujes low-level pristup do pameti pomoci pointeru a hrajes si na platforme Windows, tak pro tebe musi byt snazsi .NET, jehoz framework je dneska instalovan s kazdymi Windows a VS Express zadarmo a mam dojem, ze i professional verze bez MSDN subscription vychazi dost priznive.
  • Pokud hledas jine reseni, tak krome ActiveX, ktere ti tu uz nekdo nabizel, naleznes velmi pravdepodobne zase jen DLL a u te se stejne nevyhnes problemu jak ji spravne volat, jedine ze by u ni nekdo uvedl priklad pro Delphi, ktery bys okopiroval... A spravne volani predstavuje zase buffery a pointery.

Offline Marek Weyda

  • Hrdina
  • ****
  • Příspěvků: 275
  • Karma: 8
    • Verze Delphi: Delphi 2007, 10.1 Berlin
tak musím také přispět
« Odpověď #19 kdy: 25-01-2016, 12:29:34 »
No, přečetl jsem si tuto diskuzi až se zpožděním a je mi smutno dvojnásob, protože bohužel toto všechno znám z praxe. Dlužím ještě článek Radku Červinkovi o mých zkušenostech s vývojáři, ke kterému se snad už konečně dokopu.

Asi takhle. Byl tady u nás ve firmě jeden programátor. Pořád se ptal, většinou stále na to samé. Já jsem mu pořád trpělivě odpovídal. Jenže problém byl v tom, že on odpovědi - pravdivé - bral vždy jako nějaký útok na jeho osobu. Zakládal si na tom, že na nějakém pochybném serveru udělal IQ test na 148 bodů, za peněžní obnos mu ten server poslal certifikát a to prý znamená, že je génius. Byl nositelem titulů Bc. a DiS. a šikovně si z nich udělal jméno Bc. Jméno Příjmení, DiS. a asi si myslel, že se tím vyrovná Doc. RNDr. Jméno Příjmení, CSc. a podobně. Musel jsem se tomu smát, protože třeba můj otec je sice docentem na VŠ, ale nikdy se svými tituly nechlubil a že by mohl. Ale zpět k tomu programátorovi. Jednou měl větší úkol a na poradě měl zadáno, že má vyjít z řešení, které jsme na podobný problém spolu s jedním programátorem už navrhli. Na poradě sebevědomě řekl, že prý my jsme to udělali blbě a udělá to prý po svém. Dopadlo to tak, že to udělal přesně tak, jak jsme to kdysi dělali my, akorát polovičatě, nadělal tam šíleně chyb a já pak u zákazníka 2 dny opravoval data, zatímco on byl na dovolené. Ve firmě nakonec skončil tak, že se snažil šéfa přesvědčit o tom, že mu přeci musí zvýšit plat, když je tak geniální a šéf ho poslal někam, takže on chtěl ukončit pracovní poměr okamžitě, protože mi celou dobu tvrdil, že prý člověk může odejít ze dne na den. Že je nějaká 2 měsíční výpovědní doba, to tento génius netušil. Dnes si hraje na velkého mzdového analytika v jiné firmě, ale my tady víme o jeho kvalitách své.

Takže možná to sem nepatří, ale nějak mi to celá diskuze připomněla. A smutno mi je fakt. Osobně tady nikoho neznám, ale podle mě tady vesměs jsou chytří programátoři a pf1957 si myslím, že znalosti má velké. A proto si může také dovolit jako mazák občas někomu dát políček. Když si to zaslouží.

Offline našinec

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 5
Re:Čtení DLL - chyba
« Odpověď #20 kdy: 25-01-2016, 13:04:14 »
Víte, problém je úplně v jiné věci. Pf a Láďa mají znalosti a zkušenosti na zcela jiné odlišné úrovni. Pf očekával určitou znalost od tazatele a Láďa zase nějakou jednoduchou radu.

Jinak obecně bych si dovolil říci jednu poznámku. Delphi je označováno za velmi intuitivní. Je to pravda. Ale pro programátora s určitými znalostmi a zkušenostmi, který tuší, co má kde hledat. Pro člověka znající nějaké základy programování v Pascalu a trochu se orientující v Delphi či Lazarusu můžou činit problémy hledání příkazů a logiky v knihovnách, které se časem staly součástí Delphi.

Offline našinec

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 5

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 161
  • Karma: 2
    • Verze Delphi: D7
Re:Čtení DLL - chyba
« Odpověď #22 kdy: 26-01-2016, 07:05:55 »
Prosim te nech si ty urazky nekam jinam, tohle opravdu nemíním tolerovat. Ber to jako posledni varovani.
Pf presne popsal odpoved a IMHO naprosto správně a trpělivě a místo vděku takovou drzost.
Radek

A jestli je to datum v nicku datum narození, tak to je mi Tě líto. Takové vzkazy bych čekal od náctiletého na zive.cz. Jdu studovat. Anebo se na to vys..u. Ještě uvidím. LP 1967.

No... to jsem si teda dal. Zase jsem o něco chytřejší.
za A) Už vím, že do fóra patří reagovat jen na technické věci, ostatní je potřeba prostě nechat plavat, byť mne to v tom okamžiku prostě naštve. Nebo jít jinam když mi to vadí. Přesně, jak to psal St. Hruška - spousta lidí si z něj tady dělala srandu a on na to nereagoval. Měl prostě dvě možnosti. Buď to nechat tak a ptát se dál, nebo jít pryč.
za B) a to na A navazuje - tady se řeší věci v rychlosti a nikdo nemá čas na to řešit, co kdo jak myslel a proč to tak napsal - kdyby sis Radku (a další) přečetl všechno od začátku, přišel bys na to, že nikdo nikoho neměl v úmyslu urážet. Ale je to dlouhý a kdo by se v tom nimral (a teď to není zase invektiva, je to fakt, na to nemá nikdo čas, navíc když je to o ničem).

Všechno vzniklo ze situace, kdy se potkal dotaz věčného začátečníka s profíkem.
- dotaz, na který pf odpověděl co je špatně a přidal radu.
- doplňující dotaz (který byl míněný opravdu vážně, protože jsem opravdu netušil, proč to tak je), který pf doplnil poznámkou, která to vše spustila (tu jsi Radku asi nečetl)
- ta poznámka mne naštvala, protože kdo se podívá na moje předchozí dotazy v historii, tak by zjistil, že znalosti sice mám prachbídné, ale vždycky se snažím sakra dlouho zkoušet a hledat na webu, než sem požádám o pomoc. A taky bys Radku zjistil, že v každém mém příspěvku nechybí prosba a poděkování za snahu.
- proto jsem reagoval tak, jak jsem reagoval.

Takže resume: Pokud jsem pf urazil, omlouvám se mu, nebyl to záměr. Měl jsem prostě napsat jen jednu větu: "díky za pomoc, jen tu poslední větu sis mohl odpustit." a bylo by to.
Howg.