[ dava @ 08.08.2008. 13:40 ] @
Predpostavljam da se to izvodi na sledeci nacin:
Napravim .exe (Console Application) koji u Main metodi ima (string[] args) i dalje u toj metodi napisem sta da radi sa fajlovima (args[n]). Uzeo sm prost primjer da sve fajlove (argumente) upise u novi .txt.

Code:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream fl = File.Create("D:\\aaa.txt");
            StreamWriter sw = new StreamWriter(fl);

            StringBuilder sb = new StringBuilder();

            foreach (string arg in args)
            {
                sb.Append(arg);
            }

            sw.WriteLine(sb);
            sw.Flush();
            sw.Close();
        }
    }
}


Ali to mi radi samo za jedan fajl. Gdje sam pogrijesio. Znam da je bila jedna tema vezana za ovo ali mi nije pomogla.

Nisam rekao da program pozivam tako sto sam njegov poziv smjestio u pop-up menu windows-a pa kad idem desni click na fajl ili vise fajlova zatim pozovem prg.

[Ovu poruku je menjao dava dana 08.08.2008. u 16:01 GMT+1]
[ bunker @ 11.08.2008. 10:29 ] @
Pa ti ovde i otvaras samo jedan fajl. Meni se cini da je tvoj kod u redu, ali da ti nisi dobro definisao sta bi hteo da uradis.
[ dava @ 11.08.2008. 12:36 ] @
Ne, ne, ovako. Hocu da markiram (selektujem) vise fajlova - idem desni klik - pa iz pop-up menu-ja pozovem svoj program. Tada bi trebalo da windows proslijedi te selektovane fajlove mom programu. Moj program ih zapisuje u novootvoreni fajl "D:\\aaa.txt".

Onaj kod gore, radi samo kad je u pitanju jedan fajl. Znaci desni klik na jedan fajl pa pozovem program, a program uredno kreira aaa.txt fajl koji sadrzi putanju i ime fajla koji sam mom programu poslao kao ulazni argument.
Ako mu posaljem vise fajlova, odnosno selektujem vise fajlova pa pozovem program, aaa.txt fajl ostane prazan.
Negdje je greska.
[ dava @ 16.08.2008. 18:49 ] @
Ne znam da li sam jasno objasnio stvar pa cu probati ovako:
kad u windows explorer-u selektujemo vise fajlova pa idemo desni klik pa recimo pozivamo winrar. Tada se starta winrar a kao argumente dobije te fajlove koje smo selektovali. Isto tako ja pozovem svoj program ali on ne radi ako selektujem vise fajlova. Kako da ovo izvedem?
[ Eurora3D Team @ 04.09.2008. 22:07 ] @
@dava Mozda ovo moze da ti pomogne ... Probao sam ovo o cemu pitas, napisao sam i iskompajlovao mali Console program u VB 2008 koji ispisuje CommandLine koji dobije od windowsa. Napravio sam 2 fajla sa ekstenzijom tst i podesio explorer da je default aplikacija kojom se otvaraju ovi fajlovi ova moja aplikacija.
Rezultat
Selektujem oba i odaberem (desno pa) Open i explorer mi pokrene dve instance moje aplikacije (svaka je dobila po jedan fajl kao ulazni parametar)
Selektujem oba pa desno pa Open With pa moj program. Explorer otvara jednu instancu programa sa putanjem fajla koji je ispod strelice.
OS je WinXP
poz
[ dava @ 06.09.2008. 12:58 ] @
Bojim se da mi to nije od pomoci.
Citat:
Eurora3D Team
Selektujem oba i odaberem (desno pa) Open i explorer mi pokrene dve instance moje aplikacije (svaka je dobila po jedan fajl kao ulazni parametar)
Selektujem oba pa desno pa Open With pa moj program. Explorer otvara jednu instancu programa sa putanjem fajla koji je ispod strelice.
OS je WinXP
poz


Ovo je na neki nacin suprotno od mog zahtjeva, jer ti ovdje otvaras N broj instanci i za N broj parametara, a meni treba jedna istanca programa koja ce dobiti sve parametre.

Onaj prg. iz prvog posta fino radi kada se pozove iz komandne linije i iza njegovog poziva nanizemo argumente:
Code:

test.exe file1.txt file2.txt file34.txt


... ali kada ga pozovem na nacin koji ja hocu on ne odradi posao.

Ovo je mozda vise pitanje o windows-u kako radi u tim slucajevima.
[ deerbeer @ 06.09.2008. 13:59 ] @
Citat:
dava: Ne znam da li sam jasno objasnio stvar pa cu probati ovako:
kad u windows explorer-u selektujemo vise fajlova pa idemo desni klik pa recimo pozivamo winrar. Tada se starta winrar a kao argumente dobije te fajlove koje smo selektovali. Isto tako ja pozovem svoj program ali on ne radi ako selektujem vise fajlova. Kako da ovo izvedem?


Moras da napravis shell-extenziju (COM objekat) koja ce da radi pod Windows explorer-om kao zasebni dll
i koja ce da poziva tvoj program sa prosledjenim fajlovima.











[ Eurora3D Team @ 07.09.2008. 20:01 ] @
Pa izgleda da je ovde problem u windows shell-u posto je ocigledno da windows pokrece jednu instancu programa po fajlu.
Izgleda da ces morati da uradis nesto kao sto je @deerbeer napisao da bi dobio komandnu liniju sa vise fajlova
[ mmix @ 08.09.2008. 13:14 ] @
Tacno, ne postoji shell class za selekciju vise fajlova, "shell/command" registry tweak da pokrenes svoj executable kroz context meni moze da sa nakaci na class "*" (za bilo koju ekstenziju) ili u klasu odgovarajuce ekstenzije. Medjutim, command i open prepoznaje samo %1 parametar (sto je ime jednog fajla). Za selekciju vise fajlova mora da se napravi context menu handler COM i da se registruje u * klasi, a onda taj tvoj COM da pozove exe fajl sa naredjanim imenima fajlova koje dobije od shell-a. Ne postoji drugi nacin.

[ Dejan Vesic @ 09.09.2008. 13:58 ] @
Uobičajeno rešenje za ovo je:

- Napraviš tvoj program tako da detektuje kada je pokrenut više puta
- Svaka instanca koja se pokrene, a detektuje da je "glavni" već pokrenut, prosledi mu parametre preko NativeWin32Code.WM_COPYDATA poruke i ugasi se

Tako će glavna instanca dobiti sve parametre za više markiranih fajlova.

Primer za procesiranje poruke (slanje) je recimo ovde: http://bytes.com/forum/thread497679.html



[ dava @ 09.09.2008. 19:59 ] @
Hvala a odgovorima, a i za link. Proucicu pa kad dodjem do rjesenja postavicu ovdje. Samo nesto mi to ne izgleda kao najelegantnije rjesenje, pa zar na taj nacin rade recimo winamp, WMP, Winrar i svi ostali programi koji se mogu startati na taj nacin?
[ mmix @ 09.09.2008. 20:18 ] @
Rade upravo preko COM context handlera, evo ti npr iz mog registry-a registracija za 7-Zip arhiver, koja registruje GUID {23170F69-40C1-278A-1000-000100020000} kao context handler:

[att_img]


A taj GUID je u stvari InProc COM objekat:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}]
@="7-Zip Shell Extension"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32]
@="D:\\Program Files (x86)\\7-Zip\\7-zip.dll"
"ThreadingModel"="Apartment"


Tako da svi oni funkcionisu na taj nacin, i nije preterano tesko napraviti taj shell extension (mada ima dosta mesta u registriju na koja moras da se uselis), ali ne moze se zaobici.