#
|
# (C) Copyright 2015 Enthought, Inc., Austin, TX
|
# All right reserved.
|
#
|
# This file is open source software distributed according to the terms in
|
# LICENSE.txt
|
#
|
from __future__ import absolute_import
|
|
|
from win32ctypes.core.compat import text_type
|
from ._util import (
|
ffi, check_null, check_zero, check_false, HMODULE,
|
PVOID, RESOURCE, resource, dlls)
|
|
|
ffi.cdef("""
|
|
typedef int WINBOOL;
|
typedef WINBOOL (__stdcall *ENUMRESTYPEPROC) (HANDLE, LPTSTR, LONG_PTR);
|
typedef WINBOOL (__stdcall *ENUMRESNAMEPROC) (HANDLE, LPCTSTR, LPTSTR, LONG_PTR);
|
typedef WINBOOL (__stdcall *ENUMRESLANGPROC) (HANDLE, LPCTSTR, LPCTSTR, WORD, LONG_PTR);
|
|
BOOL WINAPI EnumResourceTypesW(
|
HMODULE hModule, ENUMRESTYPEPROC lpEnumFunc, LONG_PTR lParam);
|
BOOL WINAPI EnumResourceNamesW(
|
HMODULE hModule, LPCTSTR lpszType,
|
ENUMRESNAMEPROC lpEnumFunc, LONG_PTR lParam);
|
BOOL WINAPI EnumResourceLanguagesW(
|
HMODULE hModule, LPCTSTR lpType,
|
LPCTSTR lpName, ENUMRESLANGPROC lpEnumFunc, LONG_PTR lParam);
|
HRSRC WINAPI FindResourceExW(
|
HMODULE hModule, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage);
|
DWORD WINAPI SizeofResource(HMODULE hModule, HRSRC hResInfo);
|
HGLOBAL WINAPI LoadResource(HMODULE hModule, HRSRC hResInfo);
|
LPVOID WINAPI LockResource(HGLOBAL hResData);
|
|
HANDLE WINAPI BeginUpdateResourceW(LPCTSTR pFileName, BOOL bDeleteExistingResources);
|
BOOL WINAPI EndUpdateResourceW(HANDLE hUpdate, BOOL fDiscard);
|
BOOL WINAPI UpdateResourceW(HANDLE hUpdate, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage, LPVOID lpData, DWORD cbData);
|
|
""")
|
|
|
def ENUMRESTYPEPROC(callback):
|
def wrapped(hModule, lpszType, lParam):
|
return callback(hModule, resource(lpszType), lParam)
|
return wrapped
|
|
|
def ENUMRESNAMEPROC(callback):
|
def wrapped(hModule, lpszType, lpszName, lParam):
|
return callback(
|
hModule, resource(lpszType), resource(lpszName), lParam)
|
return wrapped
|
|
|
def ENUMRESLANGPROC(callback):
|
def wrapped(hModule, lpszType, lpszName, wIDLanguage, lParam):
|
return callback(
|
hModule, resource(lpszType), resource(lpszName),
|
wIDLanguage, lParam)
|
return wrapped
|
|
|
def _EnumResourceTypes(hModule, lpEnumFunc, lParam):
|
callback = ffi.callback('ENUMRESTYPEPROC', lpEnumFunc)
|
check_false(
|
dlls.kernel32.EnumResourceTypesW(PVOID(hModule), callback, lParam),
|
function_name='EnumResourceTypes')
|
|
|
def _EnumResourceNames(hModule, lpszType, lpEnumFunc, lParam):
|
callback = ffi.callback('ENUMRESNAMEPROC', lpEnumFunc)
|
check_false(
|
dlls.kernel32.EnumResourceNamesW(
|
PVOID(hModule), RESOURCE(lpszType), callback, lParam),
|
function_name='EnumResourceNames')
|
|
|
def _EnumResourceLanguages(hModule, lpType, lpName, lpEnumFunc, lParam):
|
callback = ffi.callback('ENUMRESLANGPROC', lpEnumFunc)
|
check_false(
|
dlls.kernel32.EnumResourceLanguagesW(
|
PVOID(hModule), RESOURCE(lpType),
|
RESOURCE(lpName), callback, lParam),
|
function_name='EnumResourceLanguages')
|
|
|
def _FindResourceEx(hModule, lpType, lpName, wLanguage):
|
return check_null(
|
dlls.kernel32.FindResourceExW(
|
PVOID(hModule), RESOURCE(lpType), RESOURCE(lpName), wLanguage),
|
function_name='FindResourceEx')
|
|
|
def _SizeofResource(hModule, hResInfo):
|
return check_zero(
|
dlls.kernel32.SizeofResource(PVOID(hModule), hResInfo),
|
function_name='SizeofResource')
|
|
|
def _LoadResource(hModule, hResInfo):
|
return check_null(
|
dlls.kernel32.LoadResource(PVOID(hModule), hResInfo),
|
function_name='LoadResource')
|
|
|
def _LockResource(hResData):
|
return check_null(
|
dlls.kernel32.LockResource(hResData),
|
function_name='LockResource')
|
|
|
def _BeginUpdateResource(pFileName, bDeleteExistingResources):
|
result = check_null(
|
dlls.kernel32.BeginUpdateResourceW(
|
text_type(pFileName), bDeleteExistingResources))
|
return HMODULE(result)
|
|
|
def _EndUpdateResource(hUpdate, fDiscard):
|
check_false(
|
dlls.kernel32.EndUpdateResourceW(PVOID(hUpdate), fDiscard),
|
function_name='EndUpdateResource')
|
|
|
def _UpdateResource(hUpdate, lpType, lpName, wLanguage, cData, cbData):
|
lpData = ffi.from_buffer(cData)
|
check_false(
|
dlls.kernel32.UpdateResourceW(
|
PVOID(hUpdate), RESOURCE(lpType), RESOURCE(lpName),
|
wLanguage, PVOID(lpData), cbData),
|
function_name='UpdateResource')
|