//----------------------------------------------------------------------------- // ExtBeginUpdateResource() // Wrapper for BeginUpdateResource(). //----------------------------------------------------------------------------- static PyObject *ExtBeginUpdateResource( PyObject *self, // passthrough argument PyObject *args) // arguments { BOOL deleteExistingResources; char *fileName; HANDLE handle; deleteExistingResources = TRUE; if (!PyArg_ParseTuple(args, "s|i", &fileName, &deleteExistingResources)) return NULL; handle = BeginUpdateResource(fileName, deleteExistingResources); if (!handle) { PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, GetLastError(), fileName); return NULL; } return PyInt_FromLong((long) handle); }
//----------------------------------------------------------------------------- // ExtGetDependentFiles() // Return a list of files that this file depends on. //----------------------------------------------------------------------------- static PyObject *ExtGetDependentFiles( PyObject *self, // passthrough argument PyObject *args) // arguments { PyObject *results; char *imageName; if (!PyArg_ParseTuple(args, "s", &imageName)) return NULL; g_ImageNames = PyDict_New(); if (!g_ImageNames) return NULL; if (!BindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES, imageName, NULL, NULL, BindStatusRoutine)) { Py_DECREF(g_ImageNames); PyErr_SetExcFromWindowsErrWithFilename(g_BindErrorException, GetLastError(), imageName); return NULL; } results = PyDict_Keys(g_ImageNames); Py_DECREF(g_ImageNames); return results; }
PyObject *PyErr_SetFromWindowsErr(int ierr) { return PyErr_SetExcFromWindowsErrWithFilename(PyExc_OSError, ierr, NULL); }
PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) { return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL); }
//----------------------------------------------------------------------------- // ExtAddIcon() // Add the icon as a resource to the specified file. //----------------------------------------------------------------------------- static PyObject *ExtAddIcon( PyObject *self, // passthrough argument PyObject *args) // arguments { char *executableName, *iconName, *data, *iconData; GRPICONDIR *groupIconDir; DWORD resourceSize; ICONDIR *iconDir; BOOL succeeded; HANDLE handle; int i; if (!PyArg_ParseTuple(args, "ss", &executableName, &iconName)) return NULL; // begin updating the executable handle = BeginUpdateResource(executableName, FALSE); if (!handle) { PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, GetLastError(), executableName); return NULL; } // first attempt to get the data from the icon file data = NULL; succeeded = TRUE; groupIconDir = NULL; if (GetFileData(iconName, &data) < 0) succeeded = FALSE; iconDir = (ICONDIR*) data; // next, attempt to add a group icon resource if (succeeded) { groupIconDir = CreateGroupIconResource(iconDir, &resourceSize); if (groupIconDir) succeeded = UpdateResource(handle, RT_GROUP_ICON, MAKEINTRESOURCE(1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), groupIconDir, resourceSize); else succeeded = FALSE; } // next, add each icon as a resource if (succeeded) { for (i = 0; i < iconDir->idCount; i++) { iconData = &data[iconDir->idEntries[i].dwImageOffset]; resourceSize = iconDir->idEntries[i].dwBytesInRes; succeeded = UpdateResource(handle, RT_ICON, MAKEINTRESOURCE(i + 1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), iconData, resourceSize); if (!succeeded) break; } } // finish writing the resource (or discarding the changes upon an error) if (!EndUpdateResource(handle, !succeeded)) { if (succeeded) { succeeded = FALSE; PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, GetLastError(), executableName); } } // clean up if (groupIconDir) PyMem_Free(groupIconDir); if (data) PyMem_Free(data); if (!succeeded) return NULL; Py_INCREF(Py_None); return Py_None; }