regutil.py :  » Windows » pyExcelerator » pywin32-214 » win32 » lib » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Windows » pyExcelerator 
pyExcelerator » pywin32 214 » win32 » lib » regutil.py
# Some registry helpers.
import win32api
import win32con
import sys
import os

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 GetRootKey():
  """Retrieves the Registry root in use by Python.
  """
# Win32s no longer supported/released.
#  if win32ui.IsWin32s():
#    return win32con.HKEY_CLASSES_ROOT
#  else:
  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 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 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, 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, 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, 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, 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, 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, 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)

www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.