[Win, C++] Własne rozszerzenie pliku.pdf

(925 KB) Pobierz
[Win, C++] Własne rozszerzenie pliku
Win,C++Własnerozszerzenie pliku
WieleaplikacjiktórepoiadająwłaneroereniaplikówmająciekawąunkcjonalnodOtóżgdy
kliknieidwukrotnienaplikodanymroereniutootwieranyjetonwokrelonejaplikacji
Prykładowoplik *.txt jest odczytywany przez notatnik. Jak oiągnądcotakiego?prawajet
stosunkowo prosta :)
Jaktosiędzieje?
PrecieżniewłącyplikudanymiPMuibydwywołanaaplikacjaktórajetpoinormowanao
otwieranymplikuJakytempotpujewprypadkupróbyotwarciaplikudanymi?prawdza
rejestr Tamąapianeinormacjeoroereniachoraotymjakpotpowadwprypadkach
próbyotwarcia
Poranawizytęwrejestrze:)
RejetrjettonajwikymietnikwWindowie– głoąłowaprecytanekiedypreemniew
Internecie. MimotojettotakżebardociekawemiejceiródłowielucennychinormacjiMy
dodamywłaneZajryjmywicdorejetru)
WMenutartwybieramy„Uruchom”wpiujemy„regedit”iatwierdamyWVicie(prepraama
ormniewiemjaktoodmienidP) i nowszych windowsach wystarczy na pasku do wyszukiwania
wpiadrekomąraitamtądtowłącyd. UruchomiinamedytorrejetruNajlepiejuruchomid
go jako Administrator. Jakwidadjetkilkagłównychklucy
Nas interesuje klucz HKEY_CLASSES_ROOT Włanie tam najdują i inormacje na temat
roereoplików Pryjryjmyiprykładoworoereniu *.txt (chcetomożewybradinne)
Win,C++Własnerozszerzeniepliku
utor:rtur„Mrowqa”Jamro
Strona 1
757514131.008.png
Win,C++Własnerozszerzenie pliku
Odszukajmy zatem klucz .txt Klikamynaniegoipatrymynawartoddomylną
Jakwidadjettociągnaków „txtile”Onjetważnyretananieintereuje)ukamyatem
nowego klucza o nazwie txtfile wklucugłównym HKEY_CLASSES_ROOT (cylijakby„obok”
klucza *.txt ). MożeużydopcjiukajniżrcnietorobidPZnalelimyimamytakieoto
drzewko:
NabdieintereowaddrewkoklucyanaconenaobrakuZnowuprawawartociami
domylnymi)Objanicooneonacająwkonkretnychpodklucach Użyłem*XXXoraext
dlategobotewartociależąodroereniaktórymiaktualniezajmujemy :)
Klucz
Znaczenie
<ext>
Krótki opi pliku wykorytywany pre ytem Prykładowo
„Dokumenttektowy”
<ext>\DefaultIcon
cieżkadoikonyPlikioroereniu*XXXbdąpredtawianea
pomocątejikonyStandardowe rozszerzenie pliku z ikonąto*ico
Niemniejjednakmożeonainajdowadw plikach takich jak *.exe
cy*dllWtedynależypodadcieżkdotegoplikupotemprecinek
i po nim numer ikony (która to ikona w aobach pliku)
Prykładowo„C\Program Files\Nasz program\nasz programexe5”
Uwaga!Niemożebydpacjimidycieżkądoplikuprecinkiem
cylicbą
<ext>\shell
Nawa jednego podklucy jet to domylnie wybierana gdy
podwójnieklikniemyLPMnaplikoroereniu*XXX
TektwywietlanynalicierowijanejgdynacinieiPPMnapliko
roereniu*XXXZnak&(ampreand)tawiaipredjednyme
nakówPowodujeonpodkrelenietegonakuiutawieniegojako
domylnego(tnjakgoklikniemynaklawiaturetoautomatycnie
jest wybierana ta opcja). Jeliwartodjetputaotanieużyta
wartoddomylna(npdlakluca„open”jetto„Otwór”)
<ext>\shell\<tryb>\command Tutkwicałaitotaproblemu)Wartoddomylnategoklucajet
to ablon jaki jet wyyłany pod lini poleceo W naym
Win,C++Własnerozszerzeniepliku
utor:rtur„Mrowqa”Jamro
Strona 2
<ext>\shell\<tryb>
757514131.009.png 757514131.010.png 757514131.011.png 757514131.001.png
Win,C++Własnerozszerzenie pliku
prypadkubdieto
”C\()\naprogramexe””%1”
Cyli„włącenie”naegopliku*XXXpowodujetaknaprawd
wywołanienaegoprogramuparametrem %1. Ale co to te %1?
Oznacza on cieżkpliku*XXXktóry„włącamy”!Wytarcywic
dopiadodpowiednikawałekkoduktórytenparametrodbiere!
Użyłem <tryb> zamiast open prawatkwiwtymżetychtrybów możemyobierobidilechcemy!
Jednakwupełnociwytarcynamtenjeden– open. Prykładowyobraekwielomatrybami
To w cerwonejjanejramcetowytkietrybyjakiemaplik*txtMożemydopiadwłane(ob
cerwonaciemnaramka)!Mogąioneodwoływaddonpnaegoprogramu!)Wielonymkółku
widadikonkplikutektowegoWrejetremożemyjąmienid)!Jece jedna warta uwagi rzecz
toawartodpomaraocowejelipyątampropoycjeprogramówprektóremożnaotworyd
danyplikytemnapodtawierejetruamobietlitrobi
Rejestrujemywłasnerozszerzenie
Napodtawiepowyżychinormacjijetemywtaniearejetrowadwłaneroereniew
ytemieMyrobimyobietorcnieBdietokrótkoopianeponieważwikodinormacjijet
awartawyżej)MożnatorobidtakżekorytającWinPIbądwplikuintalacyjnym– co jest
raczej zalecanePrecieżnierobimypliku„CytajTo!txt”wktórymkrokpokrokukażemy
użytkownikowirejetrowadnaegoroerenianieprawdaż)?WicdodiełaP!
JakapewnedążyłeauważydtandardoweroereniakładająitrechnakówTonie jest
wymógMyobierobimypiecionakowePZałóżmyżebdieto *.myext (od my ext ension).
Uwaga! bymócedytowadrejetrtrebaEdytorRejetruwłącydjakoadminitratorOtwieramy
atemgłównykluc HKEY_CLASSES_ROOT i dodajemy tam nasz podklucz – nazwany .myext .
Jako jego wartodgłównąmuimywpiadjaki unikalny (tnniepowtaralny)ciągnakówJeliby
itniałjużtakikluctotak jakbymypotanowili wykorytadobługinnegoroereniaategonie
chcemy :). Mywpiemyobie”My_extension_unique_string”Wrecywitociwytarcyżewtym
tringuawreijakiekrótkieinormacjeonaejaplikacjimałejetprawdopodobieotwo
powtórenia)Zobacmycomamy
Win,C++Własnerozszerzeniepliku
utor:rtur„Mrowqa”Jamro
Strona 3
757514131.002.png 757514131.003.png 757514131.004.png 757514131.005.png
Win,C++Własnerozszerzenie pliku
Jakwidadnadnaymroereniemnajdujeiinne– jeszcedłużePNiemuimyiogranicad
dotrechnakówDobraterarobimykolejnyklucotakiejamejnawiecowartoddomylna
popredniegoklucacyliwtymprypadkutobdie”My_extenion_unique_tring”Klucmai
najdowadnarówni .myext cyliwklucugłównym HKEY_CLASSES_ROOT . Zakładamytera
takie drzewko kluczy:
Niebdpowtarałjeceraconacąkonkretnewartocidanychklucy– to jest bez sensu.
Zerknijwgórnatabelk– tammaobjanienieZanacyłemjecenaobrakuwartoddomylną
podklucza command Jatupreadiłemcudyłowami Stawia i je wtedygdywcieżceą
pacjeChodiotożeąoneogranicnikamiparametruJeliwparametreniemapacji– nie
trebaujmowadgowcudyłów(cojarobiłem)– to w niczym nie przeszkadza). Jest tam zapisane:
”C:\my_app\my_app.exe” ”--shell” ”%1”
WycególniłemobietenrodkowyparametrCoononaca?Dlaytemu– nicZrobilimyobie
todlaiebie)Gdyktobdie„włącał”plik *.myext popreytem(tnniewcytującgo
normalniewprogramie)bdiemyotympowiadomienipredodatkowyparametr ––shell :).
WcaleniemuitegododawadChciałemtylkopokaad żetakwolnoP
CzasodpalićnaszeIDE;)
Wreciedobrnlimydotegomomentu!)NicinnegotylkoicieydcoP?Wicklawiatura do
rąk (aracejrce naklawiaturP)iklepadkodD
Jak zapewne wiesz, funkcja main matakąorm
int main();
Poiadaonatakżeinnąorm
int main( int argc, char * argv[] );
Win,C++Własnerozszerzeniepliku
utor:rtur„Mrowqa”Jamro
Strona 4
757514131.006.png
Win,C++Własnerozszerzenie pliku
Teraprawacoonacająteargumentypotregawceoobyapewnepowiedążematoco
wpólnegoparametramiwywołaniaprogramu– imająracj) argc tokrót od Argument Counter
(angLicnikargumentów)Jaknawamówi– jettomiennaprechowującalicbpryłanych
argumentówdounkcji argv jettokrótodrgumentVector(angWektorargumentów)Jetto
tablica wkaników (ale nie odwrotnie!) wkaujących na C-tringi bdące parametrami (cyli
argumentami)wywołaniaaplikacji Uwaga! Parametr o indeksie 0 toawerelatywnacieżka do
wywołanejaplikacjiRelatywnacylijaknpwywołamyjąpodwierapoleceojako”my_app”
(możebydnawetbeexe!)toparametrprełanydoaplikacjitobdiewłanietocowpialimyw
wierupoleceocyliwnaymprypadku”my_app”)
JakwidikodbdieprotywicnapiegoaCiebie(P)
int main( int argc, char * argv[] )
{
if ( argc == 3 ) // *
{
if ( strcmp( argv[ 1 ], "--shell" ) == 0 ) // jeśli wywołanie "systemowe"
{
// to wczytujemy plik, jego ścieżka to argv 2 :)
}
}
else //...
}
Dlaczego argc ma byd równy 3? Jeli ytem wywoła naą aplikacj wywoła ją trema
argumentamirelatywnacieżkaprogramu”--hell”oracieżkaotwieranegopliku– my sami to
okrelilimy w rejetrze . Funckja strcmp porównujeokreloneC-tringiJeliąoneidentyczne
wracaero”Nodobraalecemupoprotunieużydoperatora==?”OdpowiedjetprotaGdyby
napiał
if ( argv[ 1 ] == "--shell" )
TowtedytowyrażenieawebybyłoaływeDlacego?Otóżjettoporównanie adreów C-
tringówjakwiadomodwa osobne ciąginakówniemogąinajdowadwjednymmiejcu
(Pomieciłbydwakilogramyjabłek w jednym? :P).
NotobybyłonatyleNiejettotakietrudnecoP?Wrejetreprytymapewnedaitam
apiadwieleinnychinormacjiNaInternecieniemogłemnaledotyminormacjiiwytkocoo
rejetrepietoceremówiąc„amodkryłem”dlategojettrochubogowdodatkowe
cegółyPMimożerejetrjetnajwikymmietnikiemwWindowietocaemmożnaniego
wygrebadciekaweinormacjeP
rtykułmożebyddowolniekopiowanyiropowechnianywcałocibądcciPrytekcie(nawet
modyikowanym!)należyamiecidjegopochodenie(autora)
utorrtur„Mrowqa”Jamro
Kontakt: artur-jamro@wp.pl
Win,C++Własnerozszerzeniepliku
utor:rtur„Mrowqa”Jamro
Strona 5
757514131.007.png
Zgłoś jeśli naruszono regulamin