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?
Proměnná "$(FullPath)"
Re: Proměnná "$(FullPath)"
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ář )
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ář )
Re: Proměnná "$(FullPath)"
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.
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.
-
- Plugin Developer
- Posts: 707
- Joined: 08 Dec 2005, 14:33
- Location: Prague, Czech Republic
- Contact:
Re: Proměnná "$(FullPath)"
To je teda hodne zajimavy problem. Komentar ve zdrojacich MS CRT 8 u parsovani command-line:
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.
Code: Select all
2N backslashes + " ==> N backslashes and begin/end quote
2N+1 backslashes + " ==> N backslashes + literal "
N backslashes ==> N backslashes
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.
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
Re: Proměnná "$(FullPath)"
Přidat novou verzi proměnné, která nebude mít na konci zpětné lomítko?
Re: Proměnná "$(FullPath)"
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.
Pridani promenne bez lomitka je moznost. Jde spise o to ze mne toto chovani dost zaskocilo a setkal jsem se s tim poprve.
-
- Plugin Developer
- Posts: 707
- Joined: 08 Dec 2005, 14:33
- Location: Prague, Czech Republic
- Contact:
Re: Proměnná "$(FullPath)"
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.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
Re: Proměnná "$(FullPath)"
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 ...