Proměnná "$(FullPath)"

Hlášení chyb a problémů programu Altap Salamander. Buďte, prosím, ve svých popisech co nejpodrobnější a vytvořte pro každý incident nový příspěvek. Nevkládejte programem generovaná hlášení o pádu programu, pošlete je e-mailem.
Raptor

Proměnná "$(FullPath)"

Post by Raptor » 21 Jan 2010, 22:43

Zdravim, narazil jsem na takovou zajimavou vec :-) Potreboval jsem si do user menu hodit spousteni jednoho programku, ktery jako vstupni parametry pouziva syntaxi:
program.exe soubor slozka

Nadefinoval jsem si teda argumenty:
"$(FullName)" "$(FullPath)"

Dal jsem to do uvozovek aby se to dalo pouzit i na dlouhych cestach s mezerama atd. Kdyz nasledne AS toto zavola, vytvori volani napr.
call program.exe "C:\! !\file.dat" "C:\! !\"

Vypada to ok, ale tyto parametry pak nasledne program vyhodnoti tak, ze druhy je C:\! !", cili vezme lomitko jako specialni znak a rekne ze vysledek je uvozovka. Divne ceckovske chovani s neukoncenym retezcem. Aby to proslo ok, musel bych zdvojit uvozovku na konci, nebo vynechat lomitko.

A ted kde je vlastne problem? V generovani parametru $(FullPath) v AS, ze vklada na konec VZDY lomitko, v danem programu, kde se spatne vyhodnoti arg[2], nebo v systemu? Pritom kdyz zkusim podobne udelat program v Delphi, tak parametry nacte ok.

Zna nekdo reseni?

User avatar
zarevak
Plugin Developer
Plugin Developer
Posts: 789
Joined: 04 Feb 2006, 16:49
Location: Prague, Czech Republic

Re: Proměnná "$(FullPath)"

Post by zarevak » 22 Jan 2010, 00:47

Tohle mi přijde na chybu v programu... Ale nezdá se mi, že jak je vůbec možné, že korektně načte celou cestu a dělá problém s lomítkem jen na konci. Přece jenom v "céčku" je definováno více věcí začínajících lomítkem a jejich obsažení v cestě by tak vždy vyvolalo chyby.

Zkuste třeba:
C:\nove\ - podle céčka je \n označení skoku na nový řádek
C:\test\ - podle céčka je \t označení znaku tabulátoru

Pro opravení lomítka na konci bych doporučoval přídání druhého lomítka a ne uvozovky, protože \\ znamená v céčku \ lomítko a z "C:\! !\\" by se stalo: "C:\! !\".


Teorie: program neumí pracovat se složkami, za jejichž jménem je lomítko - zkuste napevno někdy poslat cestu v uvozovkách, ale bez posledního lomítka. Jednalo by se sice stále o chybu v programu, ale o takovou, kterou nelze v Salamanderu v současnosti obejít :(

Druhá otázka je, zda by se více nehodilo, kdyby Salamander jako $(FullPath) dával cestu bez lomítka. Na většině místech pracuji s cestami bez lomítka (kromě kořenových adresářů), přestože se může jednat o složku. Lomítko pak jednoduše připíšu, ale jeho odstranění ze současné FullPath je problematické. Jen kořenové adresáře způsobují komplikaci, protože může dojít ke zdvojení lomítka. (písmeno disku s dvojtečkou bez lomítka má jiný význam než kořenový adresář :( )

Raptor

Re: Proměnná "$(FullPath)"

Post by Raptor » 22 Jan 2010, 10:49

Problem nastava jen a pouze pokud je parametr v uvozovkach, cili ne C:\nove\ ale "C:\nove\". Pak se nevyhodnoti \n jako novy radek, ale chyba nastane az na konci a vezme se ze \" = ". Proste nenajde to konec retezce. Mozno odzkouset treba na dosovskem editu:
C:\>edit "asdf\"
Unknown error while accessing file
C:\asdf"'
Error 123
Proste nejak nenajde ukoncovaci uvozovku a pak to spatne vyhodnoti. Staci udelat v C maly programek co jen vylistuje seznam parametru a je videt hned co se stane. Takze definitivne neni to problem programu, ale nejaka chyba/feature systemu, potazmo mozna jeste DOSU? nevim. Ale je to tak.

V kazdem pripade asi bych se taky primluvil aby "$(FullPath)" na konec nedavalo oddelovac. Ano, ted jsem to vyresil zdvojenim v AS a jede to, ale proste je to divne.

Jan Patera
Plugin Developer
Plugin Developer
Posts: 707
Joined: 08 Dec 2005, 14:33
Location: Prague, Czech Republic
Contact:

Re: Proměnná "$(FullPath)"

Post by Jan Patera » 22 Jan 2010, 11:21

To je teda hodne zajimavy problem. Komentar ve zdrojacich MS CRT 8 u parsovani command-line:

Code: Select all

            2N backslashes + "      ==> N backslashes and begin/end quote
            2N+1 backslashes + "    ==> N backslashes + literal "
            N backslashes           ==> N backslashes
Takze Raptoruv program je zrejme v MSVC. Otazkou je, jak se chovaji jine runtimes. Dle Raptora se Delphi asi chova jinak.
Stavajici reseni, kdy $(FullPath) vzdy pridava lomitko na konci, je IMHO na prvni pohled necekane, ale na druhe nejjednodusi (viz Zarevakova poznamka o zdvojenem lomitku u cest typu C:\).
Otazka je, co s tim. Menit chovani promenne FullPath by asi nebylo nejcistsi.
Nenapada me optimalni reseni.

Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5196
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Re: Proměnná "$(FullPath)"

Post by Jan Rysavy » 22 Jan 2010, 12:16

Přidat novou verzi proměnné, která nebude mít na konci zpětné lomítko?

Raptor

Re: Proměnná "$(FullPath)"

Post by Raptor » 22 Jan 2010, 13:06

Urcite to neni kompilovane pod MSVC, je to pod GPL licenci a tak tipuju ze je to kompilovane nejakym DJGPP nebo necim takovym. Mozno zkontrolovat primo, vse je dostupne i se zdrojaky - http://aluigi.altervista.org/papers/quickbms.zip

Pridani promenne bez lomitka je moznost. Jde spise o to ze mne toto chovani dost zaskocilo a setkal jsem se s tim poprve.

Jan Patera
Plugin Developer
Plugin Developer
Posts: 707
Joined: 08 Dec 2005, 14:33
Location: Prague, Czech Republic
Contact:

Re: Proměnná "$(FullPath)"

Post by Jan Patera » 22 Jan 2010, 13:27

Raptor wrote:Urcite to neni kompilovane pod MSVC, je to pod GPL licenci a tak tipuju ze je to kompilovane nejakym DJGPP nebo necim takovym. Mozno zkontrolovat primo, vse je dostupne i se zdrojaky - http://aluigi.altervista.org/papers/quickbms.zip
Prelozene to asi opravdu bylo s nejakou mutaci gcc. Nicmene to pouziva MSVCRT.dll, vcetne funkce __getmainargs, v niz je zakopany pes, pochazejici od MSVC 6.0.

mungo
Posts: 19
Joined: 31 Dec 2007, 13:17

Re: Proměnná "$(FullPath)"

Post by mungo » 13 Feb 2010, 23:07

Jenom bych si dovolil připomenout, že přidávání lomítka pochopitelně dělá i $(Path) - viz můj dotaz Jak odstranit lomítko, které dává Salamander na konci parametru $Path ? - a to je dotaz z roku 2008 - takže takové chování Salamanderu mne nemůže zaskočit ...

Post Reply