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 [2017/02/01 07:32] – [Ukázka] 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 =====
Line 10: Line 10:
 ===== 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 26: 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 37: 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 52: Line 59:
   * pokud je DLL knihovna použitá v konzolové aplikaci, postup je zobrazován textově v okně aplikace   * 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ě     * pokud je DLL knihovna použitá ve windowsí aplikaci, progress bar je zobrazen v samostatném okně  
-==== Verze knihovny a obsluha chyb ==== 
  
 +==== Verze knihovny a obsluha chyb ====
 <code delphi>function ML_GetDllVersion(sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll <code delphi>function ML_GetDllVersion(sBuffer:unicodestring; iMaxBufferLen:integer):integer; //MtpLib.dll
 function ML_GetDllVersion:unicodestring; //MtpToolLib.lib.pas</code> function ML_GetDllVersion:unicodestring; //MtpToolLib.lib.pas</code>
Line 68: Line 75:
   * text chyby je zapsaný do ''sBuffer'', jeho paměť musí být v dostatečné velikosti vyhrazena před voláním funkce, vyhrazená velikost je ''iMaxBufferLen''   * text chyby je zapsaný do ''sBuffer'', jeho paměť musí být v dostatečné velikosti vyhrazena před voláním funkce, vyhrazená velikost je ''iMaxBufferLen''
   * pokud je vrácený text prázdný, k chybě nedošlo   * pokud je vrácený text prázdný, k chybě nedošlo
- 
  
 ==== 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 116: 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 124: 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 132: 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 146: 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 185: 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 208: 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 použití knihovny =====+==== 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 262: Line 275:
  
 ===== Známé potíže ===== ===== Známé potíže =====
-  * **zaseknutí** +* **Could not call proc** 
-    * 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 +  * pokud při spuštění napíše GeoGet něco takovéhoto:  
-    * 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) +<code> 
-  * **jméno souboru nebo adresáře** +[Script Runtime Error]: GgDrake.ggp.pas 
-    * zdá se, že žádný soubor v MTP nemá nastaven příznak umožnující přepis atributů souboru +Could not call proc 
-    * proto se <wrap hi>nepodaří</wrap> nikdy soubor <wrap hi>přejmenovat</wrap> (ale smazat jej většinou možné je!) +Routine: BUTREFRESHONCLICK''</code> 
-    * 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) +  * může být problém v chybějících systémových knihovnách. Prosím zkuste doinstalovat 
-    * 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é, tež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 +    * [[https://www.microsoft.com/en-us/download/details.aspx?id=8328|Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)]] případně 
-  * **datum, čas** +    * [[https://www.microsoft.com/en-us/download/details.aspx?id=13523|Microsoft Visual C++ 2010 SP1 Redistributable Package (x64)]] 
-    * 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á +* **zaseknutí** 
-  * **aktualizace DLL knihovny** +  * 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 
-    * 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ě+  * 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) 
 +* **jméno souboru nebo adresáře** 
 +  * zdá se, že žádný soubor v MTP nemá nastaven příznak umožňující přepis atributů souboru 
 +  * 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é, ž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á 
 +* **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 288: 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 =====
 +** 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) ** ** 1.0.0 (1.2.2017) **
   * ''MtpCmd.exe, MtpLib.dll, TestDllUse.ggp.pas''   * ''MtpCmd.exe, MtpLib.dll, TestDllUse.ggp.pas''
Line 299: Line 329:
   * ''MtpCmd.exe, MtpLib.dll, TestDllUse.ggp.pas''   * ''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     * nový: při kopírování je zobrazen postup kopírování s procenty a odhadovaným časem do konce
-    * změna: všechy stringy jsou ''unicode''+    * 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é     * změna: u funkčních objektů určených pro ukládání dat je doplněn výčet vlastností o jim specifické
  
Line 307: 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) **
user/skript/mtptoollib.1485930753.txt.gz · Last modified: 2017/02/01 08:32 (external edit)