GeoGet

Complete geocaching solutions

User Tools

Site Tools


user:skript:mtptoollib

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
user:skript:mtptoollib [2016/11/25 12:28] – [Seznam změn] gorduser:skript:mtptoollib [2021/05/02 19:06] (current) mikrom
Line 1: Line 1:
 ====== MtpToolLib ====== ====== MtpToolLib ======
-Knihovna zajišťuje podporu pro přístup k MTP zařízením z pluginů Geogetu.+Knihovna zajišťuje podporu pro přístup k MTP zařízením z pluginů GeoGetu.
  
 ===== Autor ===== ===== Autor =====
 **[[http://www.geocaching.com/profile/?u=gordici|gord]]**, **[[mailto:gord@atlas.cz|Gord]]** **[[http://www.geocaching.com/profile/?u=gordici|gord]]**, **[[mailto:gord@atlas.cz|Gord]]**
 +
 +===== Diskuse =====
 +Diskuse o pluginu najdete na [[http://www.geocaching.cz/topic/31202-geoget-a-pluginy-s-p%C5%99%C3%ADstupem-k-mtp-za%C5%99%C3%ADzen%C3%AD/|geocaching.cz]]
  
 ===== Automatická instalace ===== ===== Automatická instalace =====
 ~~GEOGET_INSTALL~~ ~~GEOGET_INSTALL~~
 +
 +<WRAP center round important 95%>
 +Pro správnou funkci knihovny může být potřeba doinstalovat, pokud ještě v systému nejsou, volně distribuované knihovny
 +
 +  * [[https://www.microsoft.com/en-us/download/details.aspx?id=8328|https://www.microsoft.com/en-us/download/details.aspx?id=8328]] (po instalaci je třeba počítač restartovat)
 +
 +</WRAP>
  
 ===== Popis ===== ===== Popis =====
Line 23: Line 33:
   * ''MtpCmd.exe'' - aplikace pro obsluhu MTP zařízení z příkazového řádku. Aplikace je zamýšlena zatím především pro ladění knihovny a obsahuje i funkce, které nejsou pomocí ''MtpToolLib.lib.pas'' dostupné   * ''MtpCmd.exe'' - aplikace pro obsluhu MTP zařízení z příkazového řádku. Aplikace je zamýšlena zatím především pro ladění knihovny a obsahuje i funkce, které nejsou pomocí ''MtpToolLib.lib.pas'' dostupné
   * testovací plugin [[#testdlluse|TestDllUse]], slouží také jako ukázka použití jednotlivých funkcí   * testovací plugin [[#testdlluse|TestDllUse]], slouží také jako ukázka použití jednotlivých funkcí
 +
 ==== Konstanty ==== ==== Konstanty ====
 Pro lepší přehlednost zdrojového kódu jsou v souboru ''MtpToolLib.dll.pas'', který je vložen do ''MtpToolLib.lib.pas'', definované konstanty: Pro lepší přehlednost zdrojového kódu jsou v souboru ''MtpToolLib.dll.pas'', který je vložen do ''MtpToolLib.lib.pas'', definované konstanty:
Line 34: Line 45:
 a ještě konstanta pro definici maximální délky vráceného textu: a ještě konstanta pro definici maximální délky vráceného textu:
 |MAX_STRING_RESULT_LENGTH|5000000| |MAX_STRING_RESULT_LENGTH|5000000|
- 
  
 ===== Funkce ===== ===== Funkce =====
Line 44: Line 54:
   * pokud některá funkce vrátí chybu -15 (např. výpis obsahu adresáře s velmi mnoha soubory), znamená to, že velikost bufferu není dostatečná. V textu chyby je zároveň uvedena minimální požadovaná velikost bufferu, kterou bude potřeba nastavit pro úspěšné provedení funkce   * pokud některá funkce vrátí chybu -15 (např. výpis obsahu adresáře s velmi mnoha soubory), znamená to, že velikost bufferu není dostatečná. V textu chyby je zároveň uvedena minimální požadovaná velikost bufferu, kterou bude potřeba nastavit pro úspěšné provedení funkce
  
-==== Obsluha chyb ====+<code delphi>procedure ML_SetProgressBar(iShow:integer); //MtpToolLib.lib.pas i MtpLib.dll</code> 
 +  * povoluje (iShow=1) nebo potlačuje (iShow=0) zobrazování progress baru při kopírování souborů 
 +  * implicitně je nastaveno zobrazení 
 +  * pokud je DLL knihovna použitá v konzolové aplikaci, postup je zobrazován textově v okně aplikace 
 +  * pokud je DLL knihovna použitá ve windowsí aplikaci, progress bar je zobrazen v samostatném okně   
 + 
 +==== Verze knihovny a obsluha chyb ==== 
 +<code delphi>function ML_GetDllVersion(sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll 
 +function ML_GetDllVersion:unicodestring; //MtpToolLib.lib.pas</code> 
 +  * vrací verzi dll knihovny 
 +  * číslo verze je zapsané do ''sBuffer'', jeho paměť musí být v dostatečné velikosti vyhrazena před voláním funkce, vyhrazená velikost je ''iMaxBufferLen''
  
 <code delphi>function ML_GetErrorCode:integer;</code> <code delphi>function ML_GetErrorCode:integer;</code>
Line 57: Line 77:
  
 ==== Práce s MTP zařízením jako takovým ==== ==== Práce s MTP zařízením jako takovým ====
- 
 <code delphi>function ML_Devices(sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll <code delphi>function ML_Devices(sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll
 function ML_Devices(sBuffer:unicodestring; iMaxBufferLen:integer):unicodestring; //MtpToolLib.lib.pas</code> function ML_Devices(sBuffer:unicodestring; iMaxBufferLen:integer):unicodestring; //MtpToolLib.lib.pas</code>
Line 102: Line 121:
   * pokud najde více zařízení podle požadavku ''sType'', nechá uživatele vybrat jedno z nich a vrací to vybrané   * pokud najde více zařízení podle požadavku ''sType'', nechá uživatele vybrat jedno z nich a vrací to vybrané
   * ''sType'' je požadavek, co má funkce hledat   * ''sType'' je požadavek, co má funkce hledat
-    * GARMIN - hledá jen GPS garmin připojenou jako standardní disk+    * GARMIN - hledá jen GPS Garmin připojenou jako standardní disk
     * ADRAKE_INST - hledá zařízení (disk i MTP) s instalovaným a:Drake a vrací cestu k instalovaným souborům (''aDrake.ini'')     * ADRAKE_INST - hledá zařízení (disk i MTP) s instalovaným a:Drake a vrací cestu k instalovaným souborům (''aDrake.ini'')
     * ADRAKE_DB - hledá zařízení (disk i MTP) s instalovaným a:Drake a vrací cestu a jméno databázového souboru, který aplikace používá     * ADRAKE_DB - hledá zařízení (disk i MTP) s instalovaným a:Drake a vrací cestu a jméno databázového souboru, který aplikace používá
Line 110: Line 129:
  
   * vrácený string obsahuje na jméno zařízení, dvojtečku, cestu a v hranatých závorkách typ, např.:   * vrácený string obsahuje na jméno zařízení, dvojtečku, cestu a v hranatých závorkách typ, např.:
-    * ''K: [GARMIN]'' - GPS garmin připojená přes USB jako Mass Storage+    * ''K: [GARMIN]'' - GPS Garmin připojená přes USB jako Mass Storage
     * ''K:\adrake [ADRAKE_INST]'' - telefon se starším Androidem připojený přes USB jako Mass Storage, a:Drake instalovaný v rootu (telefonu nebo karty, to se nepozná)     * ''K:\adrake [ADRAKE_INST]'' - telefon se starším Androidem připojený přes USB jako Mass Storage, a:Drake instalovaný v rootu (telefonu nebo karty, to se nepozná)
     * ''K:\Tmp\geoget.db3 [ADRAKE_DB]'' - telefon se starším Androidem připojený přes USB, instalovaný a:Drake používá tento databázový soubor     * ''K:\Tmp\geoget.db3 [ADRAKE_DB]'' - telefon se starším Androidem připojený přes USB, instalovaný a:Drake používá tento databázový soubor
Line 118: Line 137:
  
 ==== Práce se soubory nebo adresáři ==== ==== Práce se soubory nebo adresáři ====
- 
 <code delphi>function ML_Exists(sPath:unicodestring):integer;</code> <code delphi>function ML_Exists(sPath:unicodestring):integer;</code>
   * funkce vrací 1, pokud existuje objekt (adresář, soubor, karta, ...) zadaný cestou ''sPath''   * funkce vrací 1, pokud existuje objekt (adresář, soubor, karta, ...) zadaný cestou ''sPath''
Line 132: Line 150:
  
 ==== Práce s adresáři ==== ==== Práce s adresáři ====
- 
 <code delphi>function ML_Dir(sPath:unicodestring; sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll <code delphi>function ML_Dir(sPath:unicodestring; sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll
 function ML_Dir(sPath:unicodestring):unicodestring; //MtpToolLib.lib.pas</code> function ML_Dir(sPath:unicodestring):unicodestring; //MtpToolLib.lib.pas</code>
Line 171: Line 188:
   * ''bOverwrite''=1 povoluje "přepis" existujících souborů/adresářů   * ''bOverwrite''=1 povoluje "přepis" existujících souborů/adresářů
   * vrácená hodnota 0 znamená bez chyby   * vrácená hodnota 0 znamená bez chyby
- 
  
 ==== Práce se soubory ==== ==== Práce se soubory ====
- 
 <code delphi>function ML_GetFile(sSrc,sTrg:unicodestring):integer;</code> <code delphi>function ML_GetFile(sSrc,sTrg:unicodestring):integer;</code>
   * funkce kopíruje soubor ze zařízení do PC   * funkce kopíruje soubor ze zařízení do PC
Line 194: Line 209:
   * protože jméno souboru je jedna z jeho vlastností, bude funkce úspěšná jen v tom případě, že soubor má povolen přepis vlastností. To v drtivé většině případů neplatí   * protože jméno souboru je jedna z jeho vlastností, bude funkce úspěšná jen v tom případě, že soubor má povolen přepis vlastností. To v drtivé většině případů neplatí
  
-===== Ukázka =====+==== Vyhledání zařízení ==== 
 +<code delphi>function ML_FindGpsMobileDevice(sType:string; bAlwaysShowSelection:boolean):string;</code> 
 +  * funkce se pokusí najít požadované připojené zařízení a vrací jeho jméno (případně celou cestu) 
 +  * požadované zařízení specifikuje první parametr: 
 +    * ''GARMIN'' - GPS Garmin 
 +    * ''ADRAKE_INST'' - funkce vrací adresář s instalovanou aplikací a:Drake (tedy místo, kde je její ini soubor) 
 +    * ''ADRAKE_DB'' - funkce vrací adresář s databází, kterou aktuálně používá instalovaná aplikace a:Drake (funkce napřed vyhledá ADRAKE_INST a pak z INI souboru zjistí používanou databázi) 
 +    * <del>''LOCUS_INST'', ''LOCUS_DB''</del> - //není možné vyhledávat, protože konfigurace je uložena v XML souboru čitelném jen pod root. Addon může mít databázi úplně kdekoli bez ohledu na možnost zápisu, protože právě kvůli tomu je stále ještě kompilovaný pro starší Androidy// 
 +    * ''ALL_APPS'' - hledá všechny výše jmenované možnosti a ve vráceném stringu je na každém řádku vždy typ a nalezená cesta 
 +  * druhý parametr umožňuje zobrazit uživateli nalezený seznam a nechat jej vybrat požadovanou volbu, která je pak funkcí vrácena 
 +    * při hodnotě ''false'' je uživateli výběr k volbě zobrazen jen v tom případě, že je nalezeno více požadavku odpovídajících položek (např. a:Drake na více současně připojených telefonech a funkce nemůže rozhodnout, který z telefonů si uživatel přeje použít) 
 +    * při hodnotě ''true'' je výběr uživateli zobrazen vždy, i v případě, kdy by funkce rozhodnout mohla, protože bylo nalezeno jen jediné zařízení
  
 +===== Ukázka použití knihovny =====
 <code delphi> <code delphi>
 {$include MtpToolLib.lib.pas} {$include MtpToolLib.lib.pas}
Line 248: Line 275:
  
 ===== Známé potíže ===== ===== Známé potíže =====
 +* **Could not call proc**
 +  * pokud při spuštění napíše GeoGet něco takovéhoto: 
 +<code>
 +[Script Runtime Error]: GgDrake.ggp.pas
 +Could not call proc
 +Routine: BUTREFRESHONCLICK''</code>
 +  * může být problém v chybějících systémových knihovnách. Prosím zkuste doinstalovat
 +    * [[https://www.microsoft.com/en-us/download/details.aspx?id=8328|Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)]] případně
 +    * [[https://www.microsoft.com/en-us/download/details.aspx?id=13523|Microsoft Visual C++ 2010 SP1 Redistributable Package (x64)]]
 +* **zaseknutí**
   * občas se "MTP" na chvíli (třeba i minutu) zasekne a jakoby nic nedělá, ale pak se normálně rozjede. Podobné chování ale pozoruji i při propojeni přes Total Commander nebo i Windowsím průzkumníkem. Tak to asi budu chápat jako vlastnost   * občas se "MTP" na chvíli (třeba i minutu) zasekne a jakoby nic nedělá, ale pak se normálně rozjede. Podobné chování ale pozoruji i při propojeni přes Total Commander nebo i Windowsím průzkumníkem. Tak to asi budu chápat jako vlastnost
-  * smazání souboru někdy trvá neúměrně dlouho, netuším proč, možná to souvisí s předchozím bodem +  * smazání souboru někdy trvá neúměrně dlouho, netuším proč, možná to souvisí s předchozím bodem, možná je to proto, že se prověřuje, zda soubor nepoužívá nějaká aplikace a přes MTP driver to trvá dlouho (ale pak je divné, proč je to někdy rychle) 
-  * zdá se, že žádný soubor v MTP nemá nastaven příznak umožnující přepis atributů souboru +* **jméno souboru nebo adresáře** 
-    * proto se nepodaří nikdy soubor přejmenovat (ale smazat jej většinou možné je!) +  * zdá se, že žádný soubor v MTP nemá nastaven příznak umožňující přepis atributů souboru 
-    * proto při zápisu souboru do MTP zařízení, pokud soubor existuje, není možné soubor jednoduše přepsat, ale soubor stejného jména je napřed vymazán a pak zkopírován jako nový soubor (má tedy jiné ID než původní soubor)+  * proto se <wrap hi>nepodaří</wrap> nikdy soubor <wrap hi>přejmenovat</wrap> (ale smazat jej většinou možné je!) 
 +  * proto při zápisu souboru do MTP zařízení, pokud soubor existuje, <wrap hi>není možné soubor jednoduše přepsat</wrap>, ale soubor stejného jména je napřed vymazán a pak zkopírován jako nový soubor (má tedy jiné ID než původní soubor) 
 +  * ačkoli telefon vrací vždy všechny texty v ''unicode'' kódování, nastane pravděpodobně problém v případě, kdy Windows a telefon nebudou obsahovat stejnou lokalizaci nebo znakovou sadu. Např. v případě, kdy Windows budou anglické, těžko knihovně sdělíte, že potřebujete soubor z/do ''Interní úložiště'', jak je v telefonu s českou lokalizací nazvané paměť v telefonu mimo výměnnou SD kartu 
 +* **datum, čas**
   * při kopírování souborů nebo adresářů do MTP zařízení sice nastavuji datum vytvoření a aktualizace souboru nebo adresáře, ale zdá se, že MTP driver v zařízeních některých výrobců má vlastní hlavu a vždy nastavují aktuální datum a čas bez ohledu na atributy nastavené při vytváření. Díky předcházejícímu bodu ani není možné později nastavit tato časová razítka správně a případné synchronizace souborů je přinejmenším sporná   * při kopírování souborů nebo adresářů do MTP zařízení sice nastavuji datum vytvoření a aktualizace souboru nebo adresáře, ale zdá se, že MTP driver v zařízeních některých výrobců má vlastní hlavu a vždy nastavují aktuální datum a čas bez ohledu na atributy nastavené při vytváření. Díky předcházejícímu bodu ani není možné později nastavit tato časová razítka správně a případné synchronizace souborů je přinejmenším sporná
-  * při použití pluginu je do paměti zavedena DLL knihovna ''MtpLib.dll'', která dál používá několik systémových DLL knihoven. Po ukončení pluginu však nedojde k uvolnění systémových knihoven z paměti, proto je knihovna ''MtpLib.dll'' uzamčena proti manipulaci a **není tedy možné plugin aktualizovat** - knihovnu se nepodaří přepsat novou verzí. Je nutné napřed **restartovat Geoget**, tím dojde k odblokování knihovny a aktualizace pluginu proběhne správně+* **aktualizace DLL knihovny** 
 +  * při použití pluginu je do paměti zavedena DLL knihovna ''MtpLib.dll'', která dál používá několik systémových DLL knihoven. Po ukončení pluginu však nedojde k uvolnění systémových knihoven z paměti, proto je knihovna ''MtpLib.dll'' uzamčena proti manipulaci a <wrap hi>není tedy možné plugin aktualizovat</wrap> - knihovnu se nepodaří přepsat novou verzí. Je nutné napřed **restartovat GeoGet**, tím dojde k odblokování knihovny a aktualizace pluginu proběhne správně
  
 ===== Seznam skriptů, které používají tuto knihovnu ===== ===== Seznam skriptů, které používají tuto knihovnu =====
Line 269: Line 310:
 {{filelist>mtptoollib:*.[gz]ip&style=table&tableheader=1&tableshowdate=1&sort=mtime}} {{filelist>mtptoollib:*.[gz]ip&style=table&tableheader=1&tableshowdate=1&sort=mtime}}
  
-Zde uvedená verze **Combine** je rozšířená o funkce pro MTP zařízení. Jde rovněž o betaverzi, proto není dostupná na stránce pluginu Combine, ale jen zde. Součástí instalace je ukázková dávka pro "bezpečné" zkopírování databáze do a:Drake. Při kopírování dávka vyhledá připojené zařízení s instalací a:Drake, podle jeho INI souboru najde adresář a databázi, kterou a:Drake používá, zkontroluje, zda kopírovaná databáze z GG má stejné jméno, databázi zkopíruje a vymaže žurnálový soubor.+Zde uvedená verze **Combine** je rozšířená o funkce pro MTP zařízení. Jde rovněž o betaverzi, proto není dostupná na stránce pluginu Combine, ale jen zde. Součástí instalace je ukázková dávka pro "bezpečné" zkopírování databáze do a:Drake. Při kopírování dávka vyhledá připojené zařízení s instalací a:Drake, podle jeho INI souboru najde adresář a databázi, kterou a:Drake používá, zkontroluje, zda kopírovaná databáze z GeoGetu má stejné jméno, databázi zkopíruje a vymaže žurnálový soubor. 
 ===== Seznam změn ===== ===== Seznam změn =====
-** 0.8.(???) **+** 1.0.1 (6.4.2018) ** 
 +  * ''MtpCmd.exe'' 
 +    * nový: soubor s popisem s funkcemi a příklady spouštění z příkazového řádku 
 +  * ''MtpToolLib.dll.pas'' 
 +    * oprava: Refresh přidával k seznamu nalezených zařízení místo aby v seznamu byly jen nově/opakovaně nalezené 
 +    * oprava: nalezení ADRAKE_INST a ADRAKE_DB hledá i pro ''a:Drake Plus'' a také staré umístění v ''/adrake'' 
 + 
 +** 1.0.0 (1.2.2017) **
   * ''MtpCmd.exe, MtpLib.dll, TestDllUse.ggp.pas''   * ''MtpCmd.exe, MtpLib.dll, TestDllUse.ggp.pas''
-    * změnavšechy stringy jsou ''unicode''+    * opravasnad definitivní umravnění nemizejícího progress baru
  
 +<hidden onHidden=":!: **Zobrazit změny ve starších verzích**" onVisible="Skrýt změny ve starších verzích">
 +
 +** 0.9.9 (26.1.2017) **
 +  * ''MtpCmd.exe, MtpLib.dll, TestDllUse.ggp.pas''
 +    * nový: při kopírování je zobrazen postup kopírování s procenty a odhadovaným časem do konce
 +    * změna: všechny stringy jsou ''unicode''
 +    * změna: u funkčních objektů určených pro ukládání dat je doplněn výčet vlastností o jim specifické
  
 ** 0.7.7 (17.11.2016) ** ** 0.7.7 (17.11.2016) **
Line 281: Line 337:
     * změna: trochu jsem učesal výpisy (i v ''TestUseDll.ggp.pas'')     * změna: trochu jsem učesal výpisy (i v ''TestUseDll.ggp.pas'')
     * změna: doplněna funkce pro výpis vlastností objektů pro ukládání dat (SD karty, ...)     * změna: doplněna funkce pro výpis vlastností objektů pro ukládání dat (SD karty, ...)
- 
  
 ** 0.7.5 (11.11.2016) ** ** 0.7.5 (11.11.2016) **
    * úvodní **beta** verze    * úvodní **beta** verze
- 
-<hidden onHidden=":!: **Zobrazit změny ve starších verzích**" onVisible="Skrýt změny ve starších verzích"> 
 </hidden> </hidden>
  
 {{tag>author_Gord skript lib}} {{tag>author_Gord skript lib}}
user/skript/mtptoollib.1480073280.txt.gz · Last modified: 2016/11/25 00:00 (external edit)