Šta je novo?

Integracija u explorer

chivitli

Čuven
VIP član
Učlanjen(a)
26.04.2002
Poruke
930
Poena
619
Zanima me kako bi mogao da dodam na desni klip misa u exploreru da mi se pojavi opcija open with notepad ili nesto drugo, sta ja hocu! Nekako sigurno moze. Jel se to radi samo preko registry - ja ili treba i neki kod da se napravi. Ako treba neka neko type; u C++ - u
 
Zar je moguce da niko ne zna? Ajde bar neka neko postuje da ne zna, ovako tripujem da me bojkotujete:)
 
Ma bojkotujemo te :D

[code:1]
BOOL CMyApp::InitInstance()
{
// ...

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MYTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMDIChildWnd), // standard MDI child frame
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);

// Create main MDI Frame window.
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
// Save the pointer to the main frame window. This is the
// only way the framework will have knowledge of what the
// main frame window is.
m_pMainWnd = pMainFrame;

// enable file manager drag/drop and DDE Execute open
EnableShellOpen();
RegisterShellFileTypes();
// ...

// Show the main window using the nCmdShow parameter
// passed to the application when it was first launched.
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();

// ...
}


[/code:1]
 
Uh, znam da te mrzi da mi sad jos i objasnjavas ovo, ali kako ja da nateram ovo da proradi? Nista ja ne kapiram:( Mozes da mi das nesto gotovo sa cim ce da proradi na desni klik "open with notepad" i da to radi stalno, svaki put kad udjem u windows.
Ajde Silver, please, you're my only hope:D
 
Zanimljivo, nisam ni obratio paznju na ovaj thread... Ono sto je silverglider post-ovao je MFC C++ kod, mada ti to verovatno, sudeci po tvojoj reakciji, ne znaci mnogo.

Posto danas i nemam nista preterano pametno da radim, iskopacu malo materijala o Shell programiranju i smuckacu ti nesto ;)
 
U bre, chivitli, pa ti rece da ti je malo c++ koda dovoljno ? ;)
Nekim ljudima je parce koda sasvim dovoljno kao hint gde da traze dalje info, ali ocigledno da to ovde ili nije slucaj ili nije bilo ocigledno :D

Elem, kao prvo, nismo se razumeli, tj. ovo nije ono sto si ti trazio. Ovaj primer pokazuje kako da iz svog programa registrujes svoju vrstu fajla, dokumenta. Dakle, ti meniji iz explorera kao shella nisu fixni, nego se menjaju prema kontekstu, dakle, zavisi na sta si "desnokliknuo". Dakle, ovaj primer gore pokazuje parce koda kako da uz svoju aplikaciju PrdEditor registrujes svoj *.prd format fajla, tako da kad god kliknes na *.prd u exploreru (ili shellu) se otvori tvoj program i u njemu dokument. Ono '// ...' znaci da ima nesto koda pre odnosno posle ovog dela koda - fala Bogu da kao takav, ovaj isecak ne radi nesto smisleno sam. Za taj deo, generalno, treba da se registruje com objekt sa svojim CSLID-jem kao default viewer za dotican tip podataka, da klasa bude registrovana u HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers (i u istoj grani sa HKEY_LOCAL_MACHINE keyem kao rootom), itd. Dakle, posto nije samo prosto upisivanje u registri, najbolje je da se korise win API funkcije koje ce to obaviti (AddDocTemplate, EnableShellOpen, RegisterShellFileTypes, itd).

Ako hoces da dodajes viewere u shell context meni, treba ti funkcija CShellExt::QueryContextMenu, tako da sada imas hint gde da trazis, a za ono sto ti konkretno treba ... zasuci malo rukave. Posto je programerima solidan primer najbolja knjiga, evo ga sample microsoftovog koda, da ja sad ne bih kucao nesto bez veze.


:wave;
 
Gotovo :)

Ovaj mali ATL program dodaje opciju Open with Notepad u kontekstni meni koji se dobija desnim klikom na neki fajl. U zip-u imas tri fajla, extract-uj ih u neki folder i pokreni install.bat. Install ce registrovati dll fajl i pitace te da li da ubaci neke podatke u registry; ti mu odgovori potvrdno i to je to. Nisam mogao da isprobam da li radi na nekoj drugoj masini ili operativnom sistemu, ali ne bi trebalo da bude problema.

Javi da li radi i da li eventualno treba nesto izmeniti, mada sumnjam da cu imati vremena pre vikenda.
 
silverglider je napisao(la):
U bre, chivitli, pa ti rece da ti je malo c++ koda dovoljno ? ;)
Nekim ljudima je parce koda sasvim dovoljno kao hint gde da traze dalje info, ali ocigledno da to ovde ili nije slucaj ili nije bilo ocigledno :D

Koliko sam ja shvatio iz njegovih postova, on se uopste ne bavi programiranjem, tako da sumnjam da mu je sad ista jasnije. Izvinjavam se odmah ako gresim :) Ja nikada nisam pisao shell ekstenzije, pa sam mislio da i to vec jednom isprobam, a usput i ucinim dobro delo :)

Nego, sto ne napisa onaj drugi post odmah, ovako sam morao da rovarim po MSDN-u i internetu da nadjem upravo ono sto si ti u par recenica rekao:)

Pozdrav!
 
Titanijum, zao mi je ali ne moze da mi ubaci u registry ono sto si napisao. Mozda zato sto je verzija mog regedita 4, a ne 5. Ranije mi se slicno desavalo. Npr. regentry iz w98 ne mogu da ubacim u XP i obrnuto. Da nije mozda to u pitanju?
E da, ako ces da postujes ispravljeno sta treba, mozes li da postujes i source od svega:)

Anyway, hvala obojicicheers

P.S. Silver izvini na mucenju, al' sam zaboravio da ti kazem da sam tek pocetnik u programiranju
 
Ako je dll registrovan, mozes i rucno da dodas u registry ono sto treba. Kao sto je vec silverglider objasnio, u HKEY_CLASSES_ROOT\* treba dodati shellex\ContextMenuHandlers\OpenFileShellEx kljuceve. U poslednjem kljucu promeni default vrednost na "{374DD31C-8485-44A2-9E79-12C08AF583ED}" (bez navodnika). Sada bi moralo da radi.
 
Zaboravih source - nadam se da ces nesto nauciti iz ovoga.
 
Hm, kako ovo reci na bezbolan nacin:) Nazalost nije registrovao dll fajl. Kad pokrenem install za ono prvo mi izbaci bad command or file name, a za reg. sam sredio
Mene bas nece ovih dana:(
 
Naterao sam ga da proradi! Evo gde su bile greske (zanemaricu ono sa registry-ma):
Kad je pokusavao da registruje dll, pokusavao je to da uradi iz direktorijuma gde sam raspakovao ono(d:\temp), a posto tu nije bilo fajla regsvr32 koji se nalazi u windows\system, problem je resen kopiranjem tog fajla u d:\temp. Ali meni ni posle toga nije radio kako treba. Izgleda zato sto je u registry upisao ime dll - a kao shellf~1, a ne sa punim imenom, pa sam i to ispravio i onda je proradilo.
A sad kritike::D
U slucaju brisanja dll - a iz d:\temp dzaba bi bio sav trud. A posto je logicno da se brise odatle (pa temp dir), logicnije bi bilo da si napravio da se pri instalaciji taj fajl prebacuje u windows\system, pa se odatle registruje. Onda ne bi bilo ni problema sa regsvr32. A i trajno bi bilo.
A drugo...e izgleda da se nismo razumeli:) . Mislio sam da kad na bilo koji fajl idem desni klik, da mi da opciju open with notepad (a ne samo za .txt fajlove)
Eto, u svakom slucaju tebi puuuuuno hvala:wave;
 
chivitli je napisao(la):
...
A drugo...e izgleda da se nismo razumeli:) . Mislio sam da kad na bilo koji fajl idem desni klik, da mi da opciju open with notepad (a ne samo za .txt fajlove)
..

Opet nisi pazio na chasu, a vec je receno :D

Taj meni se zove ContextMenu; u zavisnosti od toga na kakav entity kliknes desnim dugmetom misa, povlaci se razlicit sadrzaj menija, dakle, dinamicki. Ako si hteo da se pojavljuje npr. notepad na svakom entityju, onda si morao da registrujes notepad kao default editor za sve tipove fajlova. Sta mislis zasto se npr. IE, Netscape, Opera, ... utrkuju koji ce od njih biti registrovan kao default browser ?
 
silverglider je napisao(la):
Ako si hteo da se pojavljuje npr. notepad na svakom entityju, onda si morao da registrujes notepad kao default editor za sve tipove fajlova. Sta mislis zasto se npr. IE, Netscape, Opera, ... utrkuju koji ce od njih biti registrovan kao default browser ?

Cekaj, nismo se razumeli. Tacno je to sto ti kazes, ako nema third-party programa koji ce to omoguciti, sto je chivitli i hteo, ako sam dobro razumeo. Moj program radi upravo to: dodaje Open with Notepad stavku u kontekstni meni svakog fajla.

U attachment-u je screenshot shell extenzije ciji sam source okacio. Kao sto se vidi, desnim klikom na Excel (ili bilo koji drugi) fajl dobija se Open with Notepad stavka koja radi upravo ono sto pise - otvara fajl u Notepad-u. :)
 
chivitli je napisao(la):
Kad je pokusavao da registruje dll, pokusavao je to da uradi iz direktorijuma gde sam raspakovao ono(d:\temp), a posto tu nije bilo fajla regsvr32 koji se nalazi u windows\system, problem je resen kopiranjem tog fajla u d:\temp.
Meni je u Windows-u XP regsvr32 u path-u, tako da se moze pokrenuti iz bilo kog direktorijuma. Pretpostavio sam da je to slucaj i u starijim Windows-ima, ali sam ocigledno pogresio.
Ali meni ni posle toga nije radio kako treba. Izgleda zato sto je u registry upisao ime dll - a kao shellf~1, a ne sa punim imenom, pa sam i to ispravio i onda je proradilo.

Gde je upisao ime dll-a u registry? Nigde ne treba da bude ime dll-a, vec njegov CLSID (to je onaj dugacak niz slova i brojeva). U attachment-u saljem screenshot iz regedit-a koji pokazuje kako treba da izgleda. Ne vidi se do kraja CLSID, ali ga imas u jednom od mojih prethodnih post-ova.
A sad kritike::D
U slucaju brisanja dll - a iz d:\temp dzaba bi bio sav trud. A posto je logicno da se brise odatle (pa temp dir), logicnije bi bilo da si napravio da se pri instalaciji taj fajl prebacuje u windows\system, pa se odatle registruje. Onda ne bi bilo ni problema sa regsvr32. A i trajno bi bilo.

Kao sto si video, sve sam uradio na brzinu, pa nisam napravio klasican install, vec sam samo sklepao jedan batch fajl koji bi to trebao da odradi, ali se u sustini instalacija obavlja rucno, sto i nije neki problem. Logicno je da se DLL stavi negde u Program Files, gde se, uostalom, nalaze i svi ostali programi, pa se tamo registruje. To mozes rucno uraditi, i mislio sam da je ovo ocigledno, ali izgleda da sam trebao detaljnije da objasnim.
A drugo...e izgleda da se nismo razumeli:) . Mislio sam da kad na bilo koji fajl idem desni klik, da mi da opciju open with notepad (a ne samo za .txt fajlove)

Ne, razumeli smo se, ali izgleda da nisi obavio instalaciju kako treba, ili ne radi u starijem Windows-u. Pogledaj attachment u mom prethodnom post-u i reci da li si to hteo. Probaj ponovo da instaliras: kopiraj dll u neki folder gde ce stalno biti, registruj ga tamo sa regsvr32 i dodaj odgovarajuce kljuceve u registry da izgleda kao sto je na screenshot-u, s tim sto ne mora da se zove NotepadViewShellExt (naziv je nebitan). Restartuj Windows. Sada bi trebalo da radi.
Eto, u svakom slucaju tebi puuuuuno hvala:wave;


Nema na cemu :)
 
Titanium Angel je napisao(la):
U attachment-u je screenshot shell extenzije

Kako me nervira forum, kada idem na preview, pa submit, ne posalje attachment, a preko edit se ne moze dodati.

Evo ga.
 
Nasao sam gresku. **bem ti greku, svisnuh dok nisam video gde je. Evo u cemu je fora
HKEY_CLASSES_ROOT\*\shellex\nijebitnosta, a default vrednost je bila 374DD31C-8485-44A2-9E79-12C08AF583ED, umesto {374DD31C-8485-44A2-9E79-12C08AF583ED}. ZagradeFX
Sto se tice imena dll - a, na to zaboravi:) , to nije imalo veze, ALI ime(putanja) dll - a se ipak upisuje u registry. Potrazi malo, videces (samo lupi search one vrednosti)

Eto, sad finally radi, thnxcheers
 
Titanium Angel je napisao(la):
Cekaj, nismo se razumeli. Tacno je to sto ti kazes, ako nema third-party programa koji ce to omoguciti, sto je chivitli i hteo, ako sam dobro razumeo. Moj program radi upravo to: dodaje Open with Notepad stavku u kontekstni meni svakog fajla.

Ma razumeli smo se mi dobro, nego gledam da li je chivitli razumeo ili samo koristi source - sta znaci inace onaj dzoker "*" u HKEY_CLASSES_ROOT (pored zasebnog setovanja za svaki tip fajla, bilo preko extenzije, MIME sadrzaja ili classID-a u istoj grani) ?? :D

Bilo je vise u fazonu "koja reka tece ispod savskog mosta?".


Sorry, kasnim malo, menjah 'ardver ... ;)
 
Nazad
Vrh Dno