Update of /cvsroot/pywin32/pywin32/win32/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29343/win32/src
Modified Files:
PyWinObjects.h PyWinTypes.h PyWinTypesmodule.cpp
win32apimodule.cpp
Added Files:
PyDEVMODE.cpp
Log Message:
Add support for DEVMODE structure, and
EnumDisplaySettings and ChangeDisplaySettings
Index: win32apimodule.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/win32/src/win32apimodule.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -C2 -d -r1.38 -r1.39
*** win32apimodule.cpp 13 Jul 2004 07:12:45 -0000 1.38
--- win32apimodule.cpp 7 Sep 2004 04:27:04 -0000 1.39
***************
*** 4260,4263 ****
--- 4260,4310 ----
}
+ //@pymethod <o PyDEVMODE>|win32api|EnumDisplaySettings|List available modes for specified display device
+ PyObject *PyEnumDisplaySettings(PyObject *self, PyObject *args)
+ {
+ PyObject *obDeviceName=NULL;
+ char *DeviceName;
+ DWORD ModeNum;
+ DEVMODE devmode;
+ // @pyparm string|DeviceName||Name of device, use None for current display device
+ // @pyparm int|ModeNum||Index of setting to return, or one of ENUM_CURRENT_SETTINGS, ENUM_REGISTRY_SETTINGS
+ if (!PyArg_ParseTuple(args, "Ol:EnumDisplaySettings",&obDeviceName, &ModeNum))
+ return NULL;
+ if (obDeviceName==NULL || obDeviceName==Py_None)
+ DeviceName=NULL;
+ else{
+ DeviceName=PyString_AsString(obDeviceName);
+ if (DeviceName==NULL)
+ return NULL;
+ }
+ ZeroMemory(&devmode,sizeof(DEVMODE));
+ devmode.dmSize=sizeof(DEVMODE);
+ if (!EnumDisplaySettings(DeviceName, ModeNum, &devmode)){
+ // msdn says GetLastError should return something on win2k and up, I get 0
+ PyWin_SetAPIError("EnumDisplaySettings");
+ return NULL;
+ }
+ return PyWinObject_FromDEVMODE(&devmode);
+ }
+
+ // @pymethod int|win32api|ChangeDisplaySettings|Changes video mode for default display
+ // @comm Returns DISP_CHANGE_SUCCESSFUL on success, or one of the DISP_CHANGE_* error constants on failure
+ PyObject *PyChangeDisplaySettings(PyObject *self, PyObject *args)
+ {
+ DWORD Flags;
+ PDEVMODE pdevmode;
+ PyObject *obdevmode;
+ long ret;
+ // @pyparm <o PyDEVMODE>|DevMode||A PyDEVMODE object as returned from EnumDisplaySettings, or None to reset to default settings from registry
+ // @pyparm int|Flags||One of the CDS_* constants, or 0
+ if (!PyArg_ParseTuple(args, "Ol:ChangeDisplaySettings",&obdevmode, &Flags))
+ return NULL;
+ if (!PyWinObject_AsDEVMODE(obdevmode, &pdevmode, TRUE))
+ return NULL;
+ // DISP_CHANGE_* errors don't translate as win32 error codes, just return it
+ ret=::ChangeDisplaySettings(pdevmode, Flags);
+ return Py_BuildValue("l",ret);
+ }
+
/* List of functions exported by this module */
// @module win32api|A module, encapsulating the Windows Win32 API.
***************
*** 4272,4275 ****
--- 4319,4323 ----
{"Beep", PyBeep, 1}, // @pymeth Beep|Generates a simple tone on the speaker.
{"BeginUpdateResource", PyBeginUpdateResource, 1 }, // @pymeth BeginUpdateResource|Begins an update cycle for a PE file.
+ {"ChangeDisplaySettings", PyChangeDisplaySettings, 1}, // @pymeth ChangeDisplaySettings|Changes video mode for default display
{"ClipCursor", PyClipCursor, 1}, // @pymeth ClipCursor|Confines the cursor to a rectangular area on the screen.
{"CloseHandle", PyCloseHandle, 1}, // @pymeth CloseHandle|Closes an open handle.
***************
*** 4281,4284 ****
--- 4329,4333 ----
{"DuplicateHandle", PyDuplicateHandle, 1}, // @pymeth DuplicateHandle|Duplicates a handle.
{"EndUpdateResource", PyEndUpdateResource, 1 }, // @pymeth EndUpdateResource|Ends a resource update cycle of a PE file.
+ {"EnumDisplaySettings", PyEnumDisplaySettings,1}, //@pymeth EnumDisplaySettings|Lists available modes for specified device
{"EnumResourceLanguages", PyEnumResourceLanguages, 1 }, // @pymeth EnumResourceLanguages|List languages for specified resource
{"EnumResourceNames", PyEnumResourceNames, 1 }, // @pymeth EnumResourceNames|Enumerates all the resources of the specified type from the nominated file.
--- NEW FILE: PyDEVMODE.cpp ---
#include "PyWinTypes.h"
#include "structmember.h"
#include "PyWinObjects.h"
struct PyMethodDef PyDEVMODE::methods[] = {
{"Clear", PyDEVMODE::Clear, 1}, // @pymeth Clear|Resets all members of the structure
{NULL}
};
#define OFF(e) offsetof(PyDEVMODE, e)
struct PyMemberDef PyDEVMODE::members[] = {
// DeviceName is a dummy so it will show up in property list, get and set handle manually
{"DeviceName", T_OBJECT, 0, 0, "String of at most 32 chars"},
{"SpecVersion", T_USHORT, OFF(devmode.dmSpecVersion), 0, "Should always be set to DM_SPECVERSION"},
{"DriverVersion", T_USHORT, OFF(devmode.dmDriverVersion), 0, ""},
{"Size", T_USHORT, OFF(devmode.dmSize), READONLY, "Size of structure"},
{"DriverExtra", T_USHORT, OFF(devmode.dmDriverExtra), READONLY,
"Number of extra bytes allocated for driver data, can only be set when new object is created"},
{"Fields", T_ULONG, OFF(devmode.dmFields), 0, "Bitmask of DM_* constants indicating which members are set"},
{"Orientation", T_SHORT, OFF(devmode.dmOrientation), 0, "Only applies to printers, DMORIENT_PORTRAIT or DMORIENT_LANDSCAPE"},
{"PaperSize", T_SHORT, OFF(devmode.dmPaperSize), 0, "Use 0 if PaperWidth and PaperLength are set, otherwise DMPAPER_* constant"},
{"PaperLength", T_SHORT, OFF(devmode.dmPaperLength), 0, "Specified in 1/10 millimeters"},
{"PaperWidth", T_SHORT, OFF(devmode.dmPaperWidth), 0, "Specified in 1/10 millimeters"},
{"Position_x", T_LONG, OFF(devmode.dmPosition.x), 0, "Position of display relative to desktop"},
{"Position_y", T_LONG, OFF(devmode.dmPosition.y), 0, "Position of display relative to desktop"},
// {"DisplayOrientation",T_ULONG,OFF(devmode.dmDisplayOrientation), 0, "Display rotation: DMDO_DEFAULT,DMDO_90, DMDO_180, DMDO_270"},
// {"DisplayFixedOutput",T_ULONG,OFF(devmode.dmDisplayFixedOutput), 0, "DMDFO_DEFAULT, DMDFO_CENTER, DMDFO_STRETCH"},
{"Scale", T_SHORT, OFF(devmode.dmScale), 0, "Specified as percentage, eg 50 means half size of original"},
{"Copies", T_SHORT, OFF(devmode.dmCopies), 0, ""},
{"DefaultSource", T_SHORT, OFF(devmode.dmDefaultSource), 0, "DMBIN_* constant, or can be a printer-specific value"},
{"PrintQuality", T_SHORT, OFF(devmode.dmPrintQuality), 0, "DMRES_* constant, interpreted as DPI if positive"},
{"Color", T_SHORT, OFF(devmode.dmColor), 0, "DMCOLOR_COLOR or DMCOLOR_MONOCHROME"},
{"Duplex", T_SHORT, OFF(devmode.dmDuplex), 0, "For printers that do two-sided printing: DMDUP_SIMPLEX, DMDUP_HORIZONTAL, DMDUP_VERTICAL"},
{"YResolution", T_SHORT, OFF(devmode.dmYResolution), 0, "Vertical printer resolution in DPI - if this is set, PrintQuality indicates horizontal DPI"},
{"TTOption", T_SHORT, OFF(devmode.dmTTOption), 0, "TrueType options: DMTT_BITMAP, DMTT_DOWNLOAD, DMTT_DOWNLOAD_OUTLINE, DMTT_SUBDEV"},
{"Collate", T_SHORT, OFF(devmode.dmCollate), 0, "DMCOLLATE_TRUE or DMCOLLATE_FLASE"},
{"FormName", T_OBJECT, 0, 0, "String of at most 32 chars"}, // same semantics as DeviceName
{"LogPixels", T_USHORT, OFF(devmode.dmLogPixels), 0, "Pixels per inch (only for display devices)"},
{"BitsPerPel", T_ULONG, OFF(devmode.dmBitsPerPel), 0, "Color resolution in bits per pixel"},
{"PelsWidth", T_ULONG, OFF(devmode.dmPelsWidth), 0, "Pixel width of display"},
{"PelsHeight", T_ULONG, OFF(devmode.dmPelsHeight), 0, "Pixel height of display"},
{"DisplayFlags", T_ULONG, OFF(devmode.dmDisplayFlags), 0, "Combination of DM_GRAYSCALE and DM_INTERLACED"},
{"Nup", T_ULONG, OFF(devmode.dmNup), 0, "DMNUP_SYSTEM or DMNUP_ONEUP"}, // wtf is a "Nup"?
{"DisplayFrequency",T_ULONG, OFF(devmode.dmDisplayFrequency), 0, "Refresh rate"},
{"ICMMethod", T_ULONG, OFF(devmode.dmICMMethod), 0, ""},
{"ICMIntent", T_ULONG, OFF(devmode.dmICMIntent), 0, ""},
{"MediaType", T_ULONG, OFF(devmode.dmMediaType), 0, ""},
{"DitherType", T_ULONG, OFF(devmode.dmDitherType), 0, ""},
{"Reserved1", T_ULONG, OFF(devmode.dmReserved1), 0, ""},
{"Reserved2", T_ULONG, OFF(devmode.dmReserved2), 0, ""},
{"PanningWidth", T_ULONG, OFF(devmode.dmPanningWidth), 0, ""},
{"PanningHeight", T_ULONG, OFF(devmode.dmPanningHeight), 0, ""},
{"DriverData", T_OBJECT, OFF(devmode)+sizeof(DEVMODE), 0, "Driver data appended to end of structure"},
{NULL}
};
// @object PyDEVMODE|Python object wrapping a DEVMODE structure
PYWINTYPES_EXPORT PyTypeObject PyDEVMODEType =
{
PyObject_HEAD_INIT(&PyType_Type)
0,
"PyDEVMODE",
sizeof(PyDEVMODE),
0,
PyDEVMODE::deallocFunc,
0, // tp_print;
0, // tp_getattr
0, // tp_setattr
0, // tp_compare
0, // tp_repr
0, // tp_as_number
0, // tp_as_sequence
0, // tp_as_mapping
0,
0, /* tp_call */
0, /* tp_str */
PyDEVMODE::getattro, // PyObject_GenericGetAttr
PyDEVMODE::setattro, // PyObject_GenericSetAttr
0, // tp_as_buffer;
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags;
0, // tp_doc; /* Documentation string */
0, // traverseproc tp_traverse;
0, // tp_clear;
0, // tp_richcompare;
0, // tp_weaklistoffset;
0, // tp_iter
0, // iternextfunc tp_iternext
PyDEVMODE::methods,
PyDEVMODE::members,
0, // tp_getset;
0, // tp_base;
0, // tp_dict;
0, // tp_descr_get;
0, // tp_descr_set;
0, // tp_dictoffset;
0, // tp_init;
0, // tp_alloc;
PyDEVMODE::tp_new // newfunc tp_new;
};
PyDEVMODE::PyDEVMODE(PDEVMODE pdm)
{
ob_type = &PyDEVMODEType;
memcpy(&devmode, pdm, pdm->dmSize);
pdevmode=(PDEVMODE)malloc(pdm->dmSize + pdm->dmDriverExtra);
if (pdevmode==NULL)
PyErr_Format(PyExc_MemoryError, "PyDEVMODE::PyDEVMODE - Unable to allocate DEVMODE of size %d",
pdm->dmSize + pdm->dmDriverExtra);
else;
memcpy(pdevmode, pdm, pdm->dmSize + pdm->dmDriverExtra);
_Py_NewReference(this);
}
PyDEVMODE::PyDEVMODE(void)
{
ob_type = &PyDEVMODEType;
static WORD dmSize=sizeof(DEVMODE);
pdevmode=(PDEVMODE)malloc(dmSize);
ZeroMemory(pdevmode,dmSize);
pdevmode->dmSize=dmSize;
pdevmode->dmSpecVersion=DM_SPECVERSION;
ZeroMemory(&devmode,dmSize);
devmode.dmSize=dmSize;
devmode.dmSpecVersion=DM_SPECVERSION;
_Py_NewReference(this);
}
PyDEVMODE::PyDEVMODE(USHORT dmDriverExtra)
{
ob_type = &PyDEVMODEType;
static WORD dmSize=sizeof(DEVMODE);
pdevmode=(PDEVMODE)malloc(dmSize+dmDriverExtra);
ZeroMemory(pdevmode,dmSize+dmDriverExtra);
pdevmode->dmSize=dmSize;
pdevmode->dmSpecVersion=DM_SPECVERSION;
pdevmode->dmDriverExtra=dmDriverExtra;
ZeroMemory(&devmode,dmSize);
devmode.dmSize=dmSize;
devmode.dmSpecVersion=DM_SPECVERSION;
devmode.dmDriverExtra=dmDriverExtra;
_Py_NewReference(this);
}
PyDEVMODE::~PyDEVMODE()
{
if (pdevmode!=NULL)
free(pdevmode);
}
BOOL PyDEVMODE_Check(PyObject *ob)
{
if (ob->ob_type!=&PyDEVMODEType){
PyErr_SetString(PyExc_TypeError,"Object must be a PyDEVMODE");
return FALSE;
}
return TRUE;
}
void PyDEVMODE::deallocFunc(PyObject *ob)
{
delete (PyDEVMODE *)ob;
}
PDEVMODE PyDEVMODE::GetDEVMODE(void)
{
return pdevmode;
}
PyObject *PyDEVMODE::Clear(PyObject *self, PyObject *args)
{
PDEVMODE pdevmode=((PyDEVMODE *)self)->pdevmode;
USHORT dmDriverExtra=pdevmode->dmDriverExtra;
WORD dmSize=pdevmode->dmSize;
DWORD totalsize=dmSize + dmDriverExtra;
ZeroMemory(pdevmode, totalsize);
pdevmode->dmDriverExtra=dmDriverExtra;
pdevmode->dmSize=dmSize;
pdevmode->dmSpecVersion=DM_SPECVERSION;
pdevmode=&((PyDEVMODE *)self)->devmode;
ZeroMemory(pdevmode, dmSize);
pdevmode->dmDriverExtra=dmDriverExtra;
pdevmode->dmSize=dmSize;
pdevmode->dmSpecVersion=DM_SPECVERSION;
Py_INCREF(Py_None);
return Py_None;
}
PyObject *PyDEVMODE::getattro(PyObject *self, PyObject *obname)
{
PDEVMODE pdevmode=((PyDEVMODE *)self)->pdevmode;
char *name=PyString_AsString(obname);
if (name==NULL)
return NULL;
if (strcmp(name,"DeviceName")==0)
if (pdevmode->dmDeviceName[CCHDEVICENAME-1]==0) // in case DeviceName fills space and has no trailing NULL
return PyString_FromString((char *)&pdevmode->dmDeviceName);
else
return PyString_FromStringAndSize((char *)&pdevmode->dmDeviceName, CCHDEVICENAME);
if (strcmp(name,"FormName")==0)
if (pdevmode->dmFormName[CCHFORMNAME-1]==0) // If dmFormName occupies whole 32 chars, trailing NULL not present
return PyString_FromString((char *)&pdevmode->dmFormName);
else
return PyString_FromStringAndSize((char *)&pdevmode->dmFormName, CCHFORMNAME);
if (strcmp(name,"DriverData")==0)
if (pdevmode->dmDriverExtra==0){ // No extra space allocated
Py_INCREF(Py_None);
return Py_None;
}
else
return PyString_FromStringAndSize((char *)((long)pdevmode + pdevmode->dmSize), pdevmode->dmDriverExtra);
return PyObject_GenericGetAttr(self,obname);
}
int PyDEVMODE::setattro(PyObject *self, PyObject *obname, PyObject *obvalue)
{
char *name, *value;
int valuelen;
name=PyString_AsString(obname);
if (name==NULL)
return -1;
if (strcmp(name,"DeviceName")==0){
if (PyString_AsStringAndSize(obvalue, &value, &valuelen)==-1)
return -1;
if (valuelen > CCHDEVICENAME){
PyErr_Format(PyExc_ValueError,"DeviceName must be a string of length %d or less", CCHDEVICENAME);
return -1;
}
PDEVMODE pdevmode=&((PyDEVMODE *)self)->devmode;
ZeroMemory(&pdevmode->dmDeviceName, CCHDEVICENAME);
memcpy(&pdevmode->dmDeviceName, value, valuelen);
// update variable length DEVMODE with same value
memcpy(((PyDEVMODE *)self)->pdevmode, pdevmode, pdevmode->dmSize);
return 0;
}
if (strcmp(name,"FormName")==0){
if (PyString_AsStringAndSize(obvalue, &value, &valuelen)==-1)
return -1;
if (valuelen > CCHFORMNAME){
PyErr_Format(PyExc_ValueError,"FormName must be a string of length %d or less", CCHFORMNAME);
return -1;
}
PDEVMODE pdevmode=&((PyDEVMODE *)self)->devmode;
ZeroMemory(&pdevmode->dmFormName, CCHFORMNAME);
memcpy(&pdevmode->dmFormName, value, valuelen);
// update variable length PDEVMODE with same value
memcpy(((PyDEVMODE *)self)->pdevmode, pdevmode, pdevmode->dmSize);
return 0;
}
if (strcmp(name,"DriverData")==0){
if (PyString_AsStringAndSize(obvalue, &value, &valuelen)==-1)
return -1;
PDEVMODE pdevmode=((PyDEVMODE *)self)->pdevmode;
if (valuelen > pdevmode->dmDriverExtra){
PyErr_Format(PyExc_ValueError,"Length of DriverData cannot be longer that DriverExtra (%d bytes)", pdevmode->dmDriverExtra);
return -1;
}
// This is not a real struct member, calculate address after end of fixed part of structure
char *driverdata=(char *)((long)pdevmode + pdevmode->dmSize);
ZeroMemory(driverdata, pdevmode->dmDriverExtra);
memcpy(driverdata, value, valuelen);
return 0;
}
int ret=PyObject_GenericSetAttr(self, obname, obvalue);
// Propagate changes to the externally usable structure
if (ret==0)
memcpy(((PyDEVMODE *)self)->pdevmode, &((PyDEVMODE *)self)->devmode, ((PyDEVMODE *)self)->devmode.dmSize);
return ret;
}
PyObject *PyDEVMODE::tp_new(PyTypeObject *typ, PyObject *args, PyObject *kwargs)
{
USHORT DriverExtra=0;
static char *keywords[]={"DriverExtra", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|H", keywords, &DriverExtra))
return NULL;
return new PyDEVMODE(DriverExtra);
}
BOOL PyWinObject_AsDEVMODE(PyObject *ob, PDEVMODE *ppDEVMODE, BOOL bNoneOk)
{
if (ob==Py_None)
if (bNoneOk){
*ppDEVMODE=NULL;
return TRUE;
}
else{
PyErr_SetString(PyExc_ValueError,"PyDEVMODE cannot be None in this context");
return FALSE;
}
if (!PyDEVMODE_Check(ob))
return FALSE;
*ppDEVMODE=((PyDEVMODE *)ob)->GetDEVMODE();
return TRUE;
}
PyObject *PyWinObject_FromDEVMODE(PDEVMODE pDEVMODE)
{
static WORD dmSize=sizeof(DEVMODE);
if (pDEVMODE==NULL){
Py_INCREF(Py_None);
return Py_None;
}
// make sure we can't overflow the fixed size DEVMODE in PyDEVMODE
if (pDEVMODE->dmSize>dmSize){
PyErr_Format(PyExc_WindowsError,"DEVMODE structure of size %d greater than supported size of %d", pDEVMODE->dmSize, dmSize);
return NULL;
}
PyObject *ret=new PyDEVMODE(pDEVMODE);
// check that variable sized pdevmode is allocated
if (((PyDEVMODE *)ret)->GetDEVMODE()==NULL){
Py_DECREF(ret);
ret=NULL;
}
return ret;
}
Index: PyWinObjects.h
===================================================================
RCS file: /cvsroot/pywin32/pywin32/win32/src/PyWinObjects.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** PyWinObjects.h 20 Jan 2003 23:14:45 -0000 1.6
--- PyWinObjects.h 7 Sep 2004 04:27:02 -0000 1.7
***************
*** 218,219 ****
--- 218,248 ----
};
#endif /* __PYWINTYPES_H__ */
+
+ class PYWINTYPES_EXPORT PyDEVMODE : public PyObject
+ {
+ public:
+ #ifdef _MSC_VER
+ #pragma warning( disable : 4251 )
+ #endif // _MSC_VER
+ static struct PyMemberDef members[];
+ static struct PyMethodDef methods[];
+ #ifdef _MSC_VER
+ #pragma warning( default : 4251 )
+ #endif // _MSC_VER
+
+ static void deallocFunc(PyObject *ob);
+ PyDEVMODE(PDEVMODE);
+ PyDEVMODE(void);
+ PyDEVMODE(USHORT);
+ static PyObject *getattro(PyObject *self, PyObject *name);
+ static int setattro(PyObject *self, PyObject *obname, PyObject *obvalue);
+ static PyObject *Clear(PyObject *self, PyObject *args);
+ static PyObject *tp_new(PyTypeObject *, PyObject *, PyObject *);
+ PDEVMODE GetDEVMODE(void);
+ protected:
+ // Pointer to variable length DEVMODE with dmDriverExtra bytes allocated at end, always use this externally
+ PDEVMODE pdevmode;
+ // copy of fixed portion of DEVMODE for structmember api to access
+ DEVMODE devmode;
+ ~PyDEVMODE();
+ };
Index: PyWinTypesmodule.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/win32/src/PyWinTypesmodule.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** PyWinTypesmodule.cpp 26 Jul 2004 06:47:16 -0000 1.16
--- PyWinTypesmodule.cpp 7 Sep 2004 04:27:04 -0000 1.17
***************
*** 536,539 ****
--- 536,540 ----
PyDict_SetItemString(dict, "HANDLEType", (PyObject *)&PyHANDLEType);
PyDict_SetItemString(dict, "OVERLAPPEDType", (PyObject *)&PyHANDLEType);
+ PyDict_SetItemString(dict, "DEVMODEType", (PyObject *)&PyDEVMODEType);
Index: PyWinTypes.h
===================================================================
RCS file: /cvsroot/pywin32/pywin32/win32/src/PyWinTypes.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** PyWinTypes.h 12 Jun 2004 07:45:54 -0000 1.22
--- PyWinTypes.h 7 Sep 2004 04:27:04 -0000 1.23
***************
*** 291,299 ****
extern PYWINTYPES_EXPORT PyTypeObject PySECURITY_ATTRIBUTESType;
#define PySECURITY_ATTRIBUTES_Check(ob) ((ob)->ob_type == &PySECURITY_ATTRIBUTESType)
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewSECURITY_ATTRIBUTES(PyObject *self, PyObject *args);
PYWINTYPES_EXPORT BOOL PyWinObject_AsSECURITY_ATTRIBUTES(PyObject *ob, SECURITY_ATTRIBUTES **ppSECURITY_ATTRIBUTES, BOOL bNoneOK = TRUE);
PYWINTYPES_EXPORT PyObject *PyWinObject_FromSECURITY_ATTRIBUTES(const SECURITY_ATTRIBUTES &sa);
!
/*
--- 291,301 ----
extern PYWINTYPES_EXPORT PyTypeObject PySECURITY_ATTRIBUTESType;
#define PySECURITY_ATTRIBUTES_Check(ob) ((ob)->ob_type == &PySECURITY_ATTRIBUTESType)
+ extern PYWINTYPES_EXPORT PyTypeObject PyDEVMODEType;
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewSECURITY_ATTRIBUTES(PyObject *self, PyObject *args);
PYWINTYPES_EXPORT BOOL PyWinObject_AsSECURITY_ATTRIBUTES(PyObject *ob, SECURITY_ATTRIBUTES **ppSECURITY_ATTRIBUTES, BOOL bNoneOK = TRUE);
PYWINTYPES_EXPORT PyObject *PyWinObject_FromSECURITY_ATTRIBUTES(const SECURITY_ATTRIBUTES &sa);
! PYWINTYPES_EXPORT BOOL PyWinObject_AsDEVMODE(PyObject *ob, PDEVMODE * ppDEVMODE, BOOL bNoneOK = TRUE);
! PYWINTYPES_EXPORT PyObject *PyWinObject_FromDEVMODE(PDEVMODE);
/*
|