jak spustit externi program pres makro?

Mam problem se spoustenim externi aplikace pres makro.
Chci si udelat makro, ktery spusti externi aplikaci s parametry a pak se naslednespusti import souboru z vybraneho adresa.
Import souboru me funguje, ale nespusti se mi ta aplikace.

procedure PluginWork;
begin
RunExec(‘c:\GJ\gj.exe’ + ’ " gj.ini cache ’ + GC_ID + ‘"’);
GeoImportDir(‘c:\GJ\data\’);
end;

Zkousel sem i pouzit .bat soubor, ktery se spousti bez parametru, ale nejde mi to :frowning:
RunExec(‘c:\GJ\gj.bat’);

Pokusy nahradit RunExec za RunShell taky nezabraly.

Co mam v makru blbe? Muzete nekdo poslat ukazku funkcniho makra, ktery spusti externi aplikaci a pri spusteni preda parametry?

EXE s parametry by melo jit spustit pres RunExec, BAT soubor vsak uz ne. BAT ale jde spustit pres RunShell.

Nicmene v jednom existujicim makru vidim nasledujici konstrukce, ktere tam zjevne funguji…



  gjresult := RunExec('"' + Geoget_datadir + '\geojarry.exe" "' + inif + '"');


nebo:



  dbatf := Geoget_datadir + '\gjtemp.bat';
  RunShell(dbatf);


jen dodam, ze diakritika dela v BATech hokej.. a tim myslim to, ze si do BATu hodite cestu do pracovniho adresare geogetu, a je tan data aplikací .. pokud to zpustite poklikanim mysi, nebo rucne pres cmd tak to jede, ale geoget spousti ten prikazovej radek s jinym kodovanim a tam to pak blbne..

Vidis, malem bych zapomnel, ze v uplne posledni verzi jsem do maker pridal funkci AnsiToOem, kterou muzes to jmeno adresare prekodovat tak, aby bylo pouzitelne v obsahu BAT souboru.

Některé příkazy mi nejdou spustit přímo pomocí RunExec(), ale když je uložím do bat a spustím ten se stejným obsahem, tak se to provede.

Např. toto neprojde:



script := 'reg query "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\geokuk\current\umisteni/Souboru" /v "kachle/Cache/Dir" > "' + MakroPath + 'reg_PC.txt"'
RunExec(script);


ulozene do bat to projde:



script := 'reg query "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\geokuk\current\umisteni/Souboru" /v "kachle/Cache/Dir" > "' + MakroPath + 'reg_PC.txt"'
StringToFile(AnsiToOem(script), Makropath + 'readreg_PC.bat');
RunExec('"' + MakroPath + 'readreg_PC.bat' + '"');


Toto taky přímo neprojde (přes bat ano):



script := '"' + MakroPath + 'RapiReg.exe" -v HKEY_CURRENT_USER\Software\PocketDrake\PocketDrake\Options > "' + MakroPath + 'reg_PDA.txt"'
RunExec(script);


Naopakt tento příkaz projde bez problémů:



RunExec('"' + MakroPath + 'rapisync.exe" -m -s "' + GEOGET_DATADIR + '\offline\inc" "' + MapPath + '\Img"');


V čem by mohl být problém? Nedokázal jsem vypozorovat co RunExec dokáže a co už ne. Nebo dělám nějakou chybu?

Edit: pro úplnost ještě MakroPath := D:\+Dokumenty\+GeoCaching\=GeoGet\GeoGet\script\PocketDrake

Díky.

…a makro Combine jsi nezkoušel jestli by vyhovovalo tvým požadavkům?

ještě než jsem začal psát skript tak jsem se snažil pochopit jak ho použít a jestli by mi vyhovovalo, ale za prvé jsem asi pomaleji chápající a za druhé se mi zdálo jako kanón na komára.

Teď potřebuji jenom zjednodušit zápis skriptu a pokud to jde tak vyhodit ty temporrary bat soubory a udělat to elegantně jedním příkazem, což jsem myslel, že by byl ideální RunExec.

RunExec je zapouzdreni Win32APi funkce Createprocess. tedy vytvori se novy proces a ten se spusti.

Ve vsech pripadech, ktere ti nejdou, jde o presmerovani, tedy:

1.proces > soubor

Tedy ze se ma spustit jeden proces, ten vyprodukuje na konzoli nejaky vystup, ten se zachyti, a ulozi se do souboru. Toto chovani ale nezajistuje operacni system, ale stara se o nej cmd.exe.

Tedy aby to chodilo, musi to byt spusteno skrzeva cmd.exe! tedy volat:

cmd.exe /c co_chces_spustit

BTW: od pristiho GG budes mit primo skript-funkce pro praci s registry…

Tak funguje perfektně. V mém případě je to tedy takto:



script := '"' + MakroPath + 'RapiReg.exe" -v HKEY_CURRENT_USER\Software\PocketDrake\PocketDrake\Options > "' + MakroPath + 'reg_PDA.txt"'
RunExec('cmd.exe /c "' + AnsiToOem(script) + '"');


Díky za pomoc.

(ja teda vim ze tohle potrebuju asi jen ja, a ze to asi bude spis problem ve wine, ale je nejaka moznost takhle poustet bashovy skripty?)

Tak jsem se trochu unáhlil. Znovu se u této konstrukce začal objevovat zřejmě stejný problém v případě cesty k souboru, která obsahuje národní znaky, ale zde mi funkce AnsiToOem() už nepomáhá.

Nemam sebemensi tuseni, jak ma tohle WINE zarizene.

V tomto pripade by to melo byt (snad se nemylim) v ANSI kodovani. Ale tezko rict, tohle jsem vlastne nikdy nezkousel.

Sem už úplně blbej, zase máš pravdu!
Vyzkoušel jsem všechny možné kombinace s AnsiToOEM, ale úplně ji vyhodit mě nenapadlo.

Takže takto to vypadá, že to chodí:



script := '"' + MakroPath + 'RapiReg.exe" -v HKEY_CURRENT_USER\Software\PocketDrake\PocketDrake\Options > "' + MakroPath + 'reg_PDA.txt"'
RunExec('cmd.exe /c "' + script + '"');


Jestli ti rozumim, spoustit GG pod wine a z GG chces spoustet linuxovy bash, ze? To je ovsem dost jina uloha, ktera nezalezi na GG, nybrz na wine. Najdi exe, ktery ti z wine spusti linuxovy program a mas vyhrano.

Tak jsem vymyslel další špek. Potřeboval bych to co spouštím příkazem RunExec skrýt aby to nevyskakovalo jako okno, ale bylo např. minimalizovaný. Jde mi samozřejmě hlavně o DOS okna.

Zkoušel jsem všechno možný, ale nedaří se mi to dotáhnout k dokonalosti.

Tohle nefunguje zřejmě ze stejného důvodu, jako psal geby již dříve:


RunExec('start /min cmd /c "něco"');

Když vytvořím bat s tímto obsahem, tak se sice obsah dávky spustí minimalizovaně, ale stejně zůstane viset to okno, které vyvolá RunExe (které vlastně spouští tu dávku).

Přes RunShell by to sice asi šlo, ale zase potřebuju počkat až operace doběhne, čili zase nepoužitelný.

Neporadí mi někdo jak na to?

Díky moc.

Prima podpora pro toto v GG neni. Leda snad kdyby to slo pribit pres ten cmd.exe.

Nicmene protoze lze volat cokoliv z DLL, tak sikovny Win32API programator si hrave naimportuje z kernelu funkci CreateProcess a naprogramuje si to spousteni se skrytym oknem sam. :wink: Ve skriptech GG lze delat slusna kouzla.

To je skoro zrale na knihovnu ggp :slight_smile: Takovahle funkce by se mohla leckomu hodit. (Ale pozor na prehaneni, obcas je vhodne videt, ze se neco dela.)

Tak jsem chvíli googlil a myslím, že už mám jasno!
Zjistil jsem, že nejsem API programátor a šikovný už vůbec ne :smiley:

Je tam na mě moc divokejch parametrů, musím počkat až se toho někdo šikovnější ujme :frowning: