====== ProgID (Programmatic Identifier) ======
**ProgID** (zkratka pro *Programmatic Identifier*) je textový řetězec používaný v operačním systému **Microsoft Windows** k jednoznačné identifikaci **COM tříd** (Component Object Model) a **typů souborů** v registru systému. ProgID slouží jako člověkem čitelné jméno, které je snáze použitelné než binární identifikátor **CLSID**.
===== Co je ProgID? =====
Každá COM třída má:
* **CLSID** – globálně jedinečný identifikátor (GUID) ve formátu `{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}`
* **ProgID** – lidsky čitelné jméno, např. `Excel.Application`, `Word.Document.12`, `Scripting.FileSystemObject`
ProgID je uložen v registru Windows pod klíčem:
HKEY_CLASSES_ROOT\
===== Struktura ProgID =====
Formát ProgID obvykle následuje tento vzor:
.[.Verze]
Příklady:
* `Word.Document.8` – dokument pro Word 97–2003
* `Excel.Application` – aktuální verze Excelu (bez specifikace verze)
* `Outlook.Application.16` – Outlook verze 16 (součást Office 2016+)
Verze je volitelná. Pokud není uvedena, použije se nejnovější registrovaná verze daného ProgID.
===== Vztah mezi ProgID, CLSID a registrem =====
V registru Windows je každý ProgID propojen se svým CLSID:
HKEY_CLASSES_ROOT\Excel.Application
(Default) = "Microsoft Excel Application"
CLSID = "{00024500-0000-0000-C000-000000000046}"
Zároveň pod klíčem CLSID najdeme odkaz zpět na ProgID:
HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}
(Default) = "Microsoft Excel Application"
ProgID = "Excel.Application"
Toto dvojité mapování umožňuje systému rychle převádět mezi čitelným jménem a interním identifikátorem.
===== Použití ProgID =====
ProgID je běžně používán v různých technologiích:
* **Skriptování (VBScript, PowerShell, JScript):**
var excel = new ActiveXObject("Excel.Application");
* **Windows API** – funkce jako `CLSIDFromProgID`
* **Registrační asociace souborů** – např. `.docx` → `Word.Document.12`
* **Kancelářské automatizace** – ovládání Wordu, Excelu apod. z externích aplikací
===== Příklad v PowerShellu =====
$word = New-Object -ComObject "Word.Application"
$word.Visible = $true
$doc = $word.Documents.Add()
Tento kód vytvoří novou instanci Microsoft Wordu pomocí ProgID `Word.Application`.
===== Důležité poznámky =====
* ProgID **není** globálně unikátní – jiný vývojář může zaregistrovat stejný ProgID. Proto spolehlivějším identifikátorem zůstává **CLSID**.
* ProgID může být registrován jak v **HKEY_LOCAL_MACHINE\Software\Classes**, tak v **HKEY_CURRENT_USER\Software\Classes**, což umožňuje uživatelské přepsání systémových nastavení.
* Moderní aplikace a rozhraní (např. .NET Core, UWP) se postupně od COM a ProgID vzdalují ve prospěch bezpečnějších a platformově neutrálních technologií.
===== Související pojmy =====
* [[HKCR|HKEY_CLASSES_ROOT (HKCR)]]
* **CLSID** – Class Identifier (GUID)
* **COM** – Component Object Model
* **ActiveX**
* **File association** – Asociace souborových přípon
===== Reference =====
* [https://learn.microsoft.com/en-us/windows/win32/com/-programmatic-identifiers|Microsoft Learn: Programmatic Identifiers]
* [https://learn.microsoft.com/en-us/previous-versions/windows/desktop/automat/clsid-key-hklm|CLSID and ProgID in the Registry]