Spaces:
No application file
No application file
# -*- coding: utf-8 -*- | |
# Copyright 2019 Avram Lubkin, All Rights Reserved | |
# This Source Code Form is subject to the terms of the Mozilla Public | |
# License, v. 2.0. If a copy of the MPL was not distributed with this | |
# file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
""" | |
**ANSICON Python module** | |
A Python wrapper for loading Jason Hood's ANSICON | |
ANSICON can be found at https://github.com/adoxa/ansicon | |
""" | |
import ctypes | |
from ctypes import wintypes | |
import os | |
import sys | |
KERNEL32 = ctypes.windll.kernel32 | |
KERNEL32.FreeLibrary.argtypes = (wintypes.HANDLE,) | |
KERNEL32.FreeLibrary.restype = wintypes.BOOL | |
def _get_dll_path(): | |
""" | |
Determines the path of the ANSICON DLL | |
""" | |
directory = os.path.dirname(os.path.abspath(__file__)) | |
dll = 'ANSI64.dll' if sys.maxsize > 2**31 else 'ANSI32.dll' | |
return os.path.join(directory, dll) | |
class _Loader(object): | |
""" | |
DLL Loader | |
Keeps track of DLL handle for unloading | |
""" | |
def __init__(self): | |
self.dll = None | |
def load(self): | |
""" | |
Load the DLL | |
Does nothing if the DLL is already loaded. | |
Will raise an exception, most likely WindowsError, if it fails. | |
""" | |
if self.dll is None: | |
self.dll = ctypes.WinDLL(_get_dll_path(), use_last_error=True) | |
def unload(self): | |
""" | |
Unload the DLL | |
Does nothing if the DLL has not been loaded. | |
Will raise a WindowsError exception if it fails. | |
""" | |
if self.dll is None: | |
return | |
if not KERNEL32.FreeLibrary(self.dll._handle): # pylint: disable=protected-access | |
raise ctypes.WinError(ctypes.get_last_error()) | |
self.dll = None | |
def loaded(self): | |
""" | |
Returns True if the the DLL was previously loaded | |
""" | |
return self.dll is not None | |
_ANSICON = _Loader() | |
load = _ANSICON.load # pylint: disable=invalid-name | |
unload = _ANSICON.unload # pylint: disable=invalid-name | |
loaded = _ANSICON.loaded # pylint: disable=invalid-name | |