|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- # Some registry helpers.
- import os
- import sys
-
- import win32api
- import win32con
-
- error = "Registry utility error"
-
- # A .py file has a CLSID associated with it (why? - dunno!)
- CLSIDPyFile = "{b51df050-06ae-11cf-ad3b-524153480001}"
-
- RegistryIDPyFile = "Python.File" # The registry "file type" of a .py file
- RegistryIDPycFile = "Python.CompiledFile" # The registry "file type" of a .pyc file
-
-
- def BuildDefaultPythonKey():
- """Builds a string containing the path to the current registry key.
-
- The Python registry key contains the Python version. This function
- uses the version of the DLL used by the current process to get the
- registry key currently in use.
- """
- return "Software\\Python\\PythonCore\\" + sys.winver
-
-
- def GetRootKey():
- """Retrieves the Registry root in use by Python."""
- keyname = BuildDefaultPythonKey()
- try:
- k = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, keyname)
- k.close()
- return win32con.HKEY_CURRENT_USER
- except win32api.error:
- return win32con.HKEY_LOCAL_MACHINE
-
-
- def GetRegistryDefaultValue(subkey, rootkey=None):
- """A helper to return the default value for a key in the registry."""
- if rootkey is None:
- rootkey = GetRootKey()
- return win32api.RegQueryValue(rootkey, subkey)
-
-
- def SetRegistryDefaultValue(subKey, value, rootkey=None):
- """A helper to set the default value for a key in the registry"""
- if rootkey is None:
- rootkey = GetRootKey()
- if type(value) == str:
- typeId = win32con.REG_SZ
- elif type(value) == int:
- typeId = win32con.REG_DWORD
- else:
- raise TypeError("Value must be string or integer - was passed " + repr(value))
-
- win32api.RegSetValue(rootkey, subKey, typeId, value)
-
-
- def GetAppPathsKey():
- return "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths"
-
-
- def RegisterPythonExe(exeFullPath, exeAlias=None, exeAppPath=None):
- """Register a .exe file that uses Python.
-
- Registers the .exe with the OS. This allows the specified .exe to
- be run from the command-line or start button without using the full path,
- and also to setup application specific path (ie, os.environ['PATH']).
-
- Currently the exeAppPath is not supported, so this function is general
- purpose, and not specific to Python at all. Later, exeAppPath may provide
- a reasonable default that is used.
-
- exeFullPath -- The full path to the .exe
- exeAlias = None -- An alias for the exe - if none, the base portion
- of the filename is used.
- exeAppPath -- Not supported.
- """
- # Note - Dont work on win32s (but we dont care anymore!)
- if exeAppPath:
- raise error("Do not support exeAppPath argument currently")
- if exeAlias is None:
- exeAlias = os.path.basename(exeFullPath)
- win32api.RegSetValue(
- GetRootKey(), GetAppPathsKey() + "\\" + exeAlias, win32con.REG_SZ, exeFullPath
- )
-
-
- def GetRegisteredExe(exeAlias):
- """Get a registered .exe"""
- return win32api.RegQueryValue(GetRootKey(), GetAppPathsKey() + "\\" + exeAlias)
-
-
- def UnregisterPythonExe(exeAlias):
- """Unregister a .exe file that uses Python."""
- try:
- win32api.RegDeleteKey(GetRootKey(), GetAppPathsKey() + "\\" + exeAlias)
- except win32api.error as exc:
- import winerror
-
- if exc.winerror != winerror.ERROR_FILE_NOT_FOUND:
- raise
- return
-
-
- def RegisterNamedPath(name, path):
- """Register a named path - ie, a named PythonPath entry."""
- keyStr = BuildDefaultPythonKey() + "\\PythonPath"
- if name:
- keyStr = keyStr + "\\" + name
- win32api.RegSetValue(GetRootKey(), keyStr, win32con.REG_SZ, path)
-
-
- def UnregisterNamedPath(name):
- """Unregister a named path - ie, a named PythonPath entry."""
- keyStr = BuildDefaultPythonKey() + "\\PythonPath\\" + name
- try:
- win32api.RegDeleteKey(GetRootKey(), keyStr)
- except win32api.error as exc:
- import winerror
-
- if exc.winerror != winerror.ERROR_FILE_NOT_FOUND:
- raise
- return
-
-
- def GetRegisteredNamedPath(name):
- """Get a registered named path, or None if it doesnt exist."""
- keyStr = BuildDefaultPythonKey() + "\\PythonPath"
- if name:
- keyStr = keyStr + "\\" + name
- try:
- return win32api.RegQueryValue(GetRootKey(), keyStr)
- except win32api.error as exc:
- import winerror
-
- if exc.winerror != winerror.ERROR_FILE_NOT_FOUND:
- raise
- return None
-
-
- def RegisterModule(modName, modPath):
- """Register an explicit module in the registry. This forces the Python import
- mechanism to locate this module directly, without a sys.path search. Thus
- a registered module need not appear in sys.path at all.
-
- modName -- The name of the module, as used by import.
- modPath -- The full path and file name of the module.
- """
- try:
- import os
-
- os.stat(modPath)
- except os.error:
- print("Warning: Registering non-existant module %s" % modPath)
- win32api.RegSetValue(
- GetRootKey(),
- BuildDefaultPythonKey() + "\\Modules\\%s" % modName,
- win32con.REG_SZ,
- modPath,
- )
-
-
- def UnregisterModule(modName):
- """Unregister an explicit module in the registry.
-
- modName -- The name of the module, as used by import.
- """
- try:
- win32api.RegDeleteKey(
- GetRootKey(), BuildDefaultPythonKey() + "\\Modules\\%s" % modName
- )
- except win32api.error as exc:
- import winerror
-
- if exc.winerror != winerror.ERROR_FILE_NOT_FOUND:
- raise
-
-
- def GetRegisteredHelpFile(helpDesc):
- """Given a description, return the registered entry."""
- try:
- return GetRegistryDefaultValue(BuildDefaultPythonKey() + "\\Help\\" + helpDesc)
- except win32api.error:
- try:
- return GetRegistryDefaultValue(
- BuildDefaultPythonKey() + "\\Help\\" + helpDesc,
- win32con.HKEY_CURRENT_USER,
- )
- except win32api.error:
- pass
- return None
-
-
- def RegisterHelpFile(helpFile, helpPath, helpDesc=None, bCheckFile=1):
- """Register a help file in the registry.
-
- Note that this used to support writing to the Windows Help
- key, however this is no longer done, as it seems to be incompatible.
-
- helpFile -- the base name of the help file.
- helpPath -- the path to the help file
- helpDesc -- A description for the help file. If None, the helpFile param is used.
- bCheckFile -- A flag indicating if the file existence should be checked.
- """
- if helpDesc is None:
- helpDesc = helpFile
- fullHelpFile = os.path.join(helpPath, helpFile)
- try:
- if bCheckFile:
- os.stat(fullHelpFile)
- except os.error:
- raise ValueError("Help file does not exist")
- # Now register with Python itself.
- win32api.RegSetValue(
- GetRootKey(),
- BuildDefaultPythonKey() + "\\Help\\%s" % helpDesc,
- win32con.REG_SZ,
- fullHelpFile,
- )
-
-
- def UnregisterHelpFile(helpFile, helpDesc=None):
- """Unregister a help file in the registry.
-
- helpFile -- the base name of the help file.
- helpDesc -- A description for the help file. If None, the helpFile param is used.
- """
- key = win32api.RegOpenKey(
- win32con.HKEY_LOCAL_MACHINE,
- "Software\\Microsoft\\Windows\\Help",
- 0,
- win32con.KEY_ALL_ACCESS,
- )
- try:
- try:
- win32api.RegDeleteValue(key, helpFile)
- except win32api.error as exc:
- import winerror
-
- if exc.winerror != winerror.ERROR_FILE_NOT_FOUND:
- raise
- finally:
- win32api.RegCloseKey(key)
-
- # Now de-register with Python itself.
- if helpDesc is None:
- helpDesc = helpFile
- try:
- win32api.RegDeleteKey(
- GetRootKey(), BuildDefaultPythonKey() + "\\Help\\%s" % helpDesc
- )
- except win32api.error as exc:
- import winerror
-
- if exc.winerror != winerror.ERROR_FILE_NOT_FOUND:
- raise
-
-
- def RegisterCoreDLL(coredllName=None):
- """Registers the core DLL in the registry.
-
- If no params are passed, the name of the Python DLL used in
- the current process is used and registered.
- """
- if coredllName is None:
- coredllName = win32api.GetModuleFileName(sys.dllhandle)
- # must exist!
- else:
- try:
- os.stat(coredllName)
- except os.error:
- print("Warning: Registering non-existant core DLL %s" % coredllName)
-
- hKey = win32api.RegCreateKey(GetRootKey(), BuildDefaultPythonKey())
- try:
- win32api.RegSetValue(hKey, "Dll", win32con.REG_SZ, coredllName)
- finally:
- win32api.RegCloseKey(hKey)
- # Lastly, setup the current version to point to me.
- win32api.RegSetValue(
- GetRootKey(),
- "Software\\Python\\PythonCore\\CurrentVersion",
- win32con.REG_SZ,
- sys.winver,
- )
-
-
- def RegisterFileExtensions(defPyIcon, defPycIcon, runCommand):
- """Register the core Python file extensions.
-
- defPyIcon -- The default icon to use for .py files, in 'fname,offset' format.
- defPycIcon -- The default icon to use for .pyc files, in 'fname,offset' format.
- runCommand -- The command line to use for running .py files
- """
- # Register the file extensions.
- pythonFileId = RegistryIDPyFile
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT, ".py", win32con.REG_SZ, pythonFileId
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT, pythonFileId, win32con.REG_SZ, "Python File"
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- "%s\\CLSID" % pythonFileId,
- win32con.REG_SZ,
- CLSIDPyFile,
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- "%s\\DefaultIcon" % pythonFileId,
- win32con.REG_SZ,
- defPyIcon,
- )
- base = "%s\\Shell" % RegistryIDPyFile
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT, base + "\\Open", win32con.REG_SZ, "Run"
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\Open\\Command",
- win32con.REG_SZ,
- runCommand,
- )
-
- # Register the .PYC.
- pythonFileId = RegistryIDPycFile
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT, ".pyc", win32con.REG_SZ, pythonFileId
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- pythonFileId,
- win32con.REG_SZ,
- "Compiled Python File",
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- "%s\\DefaultIcon" % pythonFileId,
- win32con.REG_SZ,
- defPycIcon,
- )
- base = "%s\\Shell" % pythonFileId
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT, base + "\\Open", win32con.REG_SZ, "Run"
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\Open\\Command",
- win32con.REG_SZ,
- runCommand,
- )
-
-
- def RegisterShellCommand(shellCommand, exeCommand, shellUserCommand=None):
- # Last param for "Open" - for a .py file to be executed by the command line
- # or shell execute (eg, just entering "foo.py"), the Command must be "Open",
- # but you may associate a different name for the right-click menu.
- # In our case, normally we have "Open=Run"
- base = "%s\\Shell" % RegistryIDPyFile
- if shellUserCommand:
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\%s" % (shellCommand),
- win32con.REG_SZ,
- shellUserCommand,
- )
-
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\%s\\Command" % (shellCommand),
- win32con.REG_SZ,
- exeCommand,
- )
-
-
- def RegisterDDECommand(shellCommand, ddeApp, ddeTopic, ddeCommand):
- base = "%s\\Shell" % RegistryIDPyFile
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\%s\\ddeexec" % (shellCommand),
- win32con.REG_SZ,
- ddeCommand,
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\%s\\ddeexec\\Application" % (shellCommand),
- win32con.REG_SZ,
- ddeApp,
- )
- win32api.RegSetValue(
- win32con.HKEY_CLASSES_ROOT,
- base + "\\%s\\ddeexec\\Topic" % (shellCommand),
- win32con.REG_SZ,
- ddeTopic,
- )
|