Uploaded Test files
This commit is contained in:
		
							parent
							
								
									f584ad9d97
								
							
						
					
					
						commit
						2e81cb7d99
					
				
					 16627 changed files with 2065359 additions and 102444 deletions
				
			
		
							
								
								
									
										800
									
								
								venv/Lib/site-packages/win32/include/PyWinTypes.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										800
									
								
								venv/Lib/site-packages/win32/include/PyWinTypes.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,800 @@
 | 
			
		|||
 | 
			
		||||
#ifndef __PYWINTYPES_H__
 | 
			
		||||
#define __PYWINTYPES_H__
 | 
			
		||||
 | 
			
		||||
// If building under a GCC, tweak what we need.
 | 
			
		||||
#if defined(__GNUC__) && defined(_POSIX_C_SOURCE)
 | 
			
		||||
// python.h complains if _POSIX_C_SOURCE is already defined
 | 
			
		||||
#undef _POSIX_C_SOURCE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// early msvc versions complain about pragma #s it doesn't understand
 | 
			
		||||
// C:\mssdk\VC\INCLUDE\string.h(142) : warning C4616: #pragma warning : warning number '6059' out of range, must be
 | 
			
		||||
// between '4001' and '4999' and: C:\mssdk\include\wingdi.h(4340) : warning C4068: unknown pragma I doubt we ever care
 | 
			
		||||
// about that warning, so unconditionally nuke em!
 | 
			
		||||
#pragma warning(disable : 4616 4068)
 | 
			
		||||
// Python.h and Windows.h both protect themselves from multiple
 | 
			
		||||
// includes - so it is safe to do here (and provides a handy
 | 
			
		||||
// choke point for #include vagaries
 | 
			
		||||
 | 
			
		||||
// Some other warnings generated by MSVC6 which we don't care about
 | 
			
		||||
#if (PY_VERSION_HEX < 0x02060000)
 | 
			
		||||
#pragma warning(disable : 4035)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// windows rpc.h defines "small" as "char" which breaks Python's accu.h,
 | 
			
		||||
// so we undefine it before including python.
 | 
			
		||||
#ifdef small
 | 
			
		||||
#undef small
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "Python.h"
 | 
			
		||||
// many many files need python's structmember.h, and its possible people
 | 
			
		||||
// #included windows.h before including us...
 | 
			
		||||
#ifdef WRITE_RESTRICTED
 | 
			
		||||
#undef WRITE_RESTRICTED
 | 
			
		||||
#endif
 | 
			
		||||
#include "structmember.h"
 | 
			
		||||
// and python's structmember.h #defines this, conflicting with windows.h
 | 
			
		||||
#ifdef WRITE_RESTRICTED
 | 
			
		||||
#undef WRITE_RESTRICTED
 | 
			
		||||
#endif
 | 
			
		||||
#include "windows.h"
 | 
			
		||||
#undef WRITE_RESTRICTED  // stop anyone using the wrong one accidently...
 | 
			
		||||
 | 
			
		||||
// Helpers for our modules.
 | 
			
		||||
// Some macros to help the pywin32 modules co-exist in py2x and py3k.
 | 
			
		||||
// Creates and initializes local variables called 'module' and 'dict'.
 | 
			
		||||
 | 
			
		||||
#if (PY_VERSION_HEX < 0x03000000)
 | 
			
		||||
 | 
			
		||||
// Use to define the function itself (ie, its name, linkage, params)
 | 
			
		||||
#define PYWIN_MODULE_INIT_FUNC(module_name) extern "C" __declspec(dllexport) void init##module_name(void)
 | 
			
		||||
 | 
			
		||||
// If the module needs to early-exit on an error condition.
 | 
			
		||||
#define PYWIN_MODULE_INIT_RETURN_ERROR return;
 | 
			
		||||
 | 
			
		||||
// When the module has successfully initialized.
 | 
			
		||||
#define PYWIN_MODULE_INIT_RETURN_SUCCESS return;
 | 
			
		||||
 | 
			
		||||
// To setup the module object itself and the module's dictionary.
 | 
			
		||||
#define PYWIN_MODULE_INIT_PREPARE(module_name, functions, docstring) \
 | 
			
		||||
    PyObject *dict, *module;                                         \
 | 
			
		||||
    if (PyWinGlobals_Ensure() == -1)                                 \
 | 
			
		||||
        return;                                                      \
 | 
			
		||||
    if (!(module = Py_InitModule(#module_name, functions)))          \
 | 
			
		||||
        return;                                                      \
 | 
			
		||||
    if (!(dict = PyModule_GetDict(module)))                          \
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
// py3k module helpers.
 | 
			
		||||
// Use to define the function itself (ie, its name, linkage, params)
 | 
			
		||||
#define PYWIN_MODULE_INIT_FUNC(module_name) extern "C" __declspec(dllexport) PyObject *PyInit_##module_name(void)
 | 
			
		||||
 | 
			
		||||
// If the module needs to early-exit on an error condition.
 | 
			
		||||
#define PYWIN_MODULE_INIT_RETURN_ERROR return NULL;
 | 
			
		||||
 | 
			
		||||
// When the module has successfully initialized.
 | 
			
		||||
#define PYWIN_MODULE_INIT_RETURN_SUCCESS return module;
 | 
			
		||||
 | 
			
		||||
// To setup the module object itself and the module's dictionary.
 | 
			
		||||
#define PYWIN_MODULE_INIT_PREPARE(module_name, functions, docstring)                                        \
 | 
			
		||||
    PyObject *dict, *module;                                                                                \
 | 
			
		||||
    static PyModuleDef module_name##_def = {PyModuleDef_HEAD_INIT, #module_name, docstring, -1, functions}; \
 | 
			
		||||
    if (PyWinGlobals_Ensure() == -1)                                                                        \
 | 
			
		||||
        return NULL;                                                                                        \
 | 
			
		||||
    if (!(module = PyModule_Create(&module_name##_def)))                                                    \
 | 
			
		||||
        return NULL;                                                                                        \
 | 
			
		||||
    if (!(dict = PyModule_GetDict(module)))                                                                 \
 | 
			
		||||
        return NULL;
 | 
			
		||||
#endif  // PY_VERSION_HEX
 | 
			
		||||
 | 
			
		||||
// Helpers for our types.
 | 
			
		||||
#if (PY_VERSION_HEX < 0x03000000)
 | 
			
		||||
#define PYWIN_OBJECT_HEAD PyObject_HEAD_INIT(&PyType_Type) 0,
 | 
			
		||||
#define PYWIN_ATTR_CONVERT PyString_AsString
 | 
			
		||||
 | 
			
		||||
#else  // Py3k definitions
 | 
			
		||||
// Macro to handle PyObject layout changes in Py3k
 | 
			
		||||
#define PYWIN_OBJECT_HEAD PyVarObject_HEAD_INIT(NULL, 0)
 | 
			
		||||
 | 
			
		||||
/* Attribute names are passed as Unicode in Py3k, so use a macro to
 | 
			
		||||
    switch between string and unicode conversion.  This function is not
 | 
			
		||||
    documented, but is used extensively in the Python codebase itself,
 | 
			
		||||
    so it's reasonable to assume it won't disappear anytime soon.
 | 
			
		||||
*/
 | 
			
		||||
#define PYWIN_ATTR_CONVERT (char *)_PyUnicode_AsString
 | 
			
		||||
 | 
			
		||||
/* Some API functions changed/removed in python 3.0
 | 
			
		||||
    Definitions for the string functions are in stringobject.h,
 | 
			
		||||
    but comments indicate that this header is likely to go away in 3.1.
 | 
			
		||||
*/
 | 
			
		||||
#define PyString_Check PyBytes_Check
 | 
			
		||||
#define PyString_Size PyBytes_Size
 | 
			
		||||
#define PyString_AsString PyBytes_AsString
 | 
			
		||||
#define PyString_AsStringAndSize PyBytes_AsStringAndSize
 | 
			
		||||
#define PyString_FromString PyBytes_FromString
 | 
			
		||||
#define PyString_FromStringAndSize PyBytes_FromStringAndSize
 | 
			
		||||
#define _PyString_Resize _PyBytes_Resize
 | 
			
		||||
#define PyString_AS_STRING PyBytes_AS_STRING
 | 
			
		||||
#define PyString_GET_SIZE PyBytes_GET_SIZE
 | 
			
		||||
#define PyString_Concat PyBytes_Concat
 | 
			
		||||
#define PyInt_Check PyLong_Check
 | 
			
		||||
#define PyInt_FromLong PyLong_FromLong
 | 
			
		||||
#define PyInt_AsLong PyLong_AsLong
 | 
			
		||||
#define PyInt_AS_LONG PyLong_AS_LONG
 | 
			
		||||
#define PyInt_FromSsize_t PyLong_FromSsize_t
 | 
			
		||||
#define PyInt_AsSsize_t PyLong_AsSsize_t
 | 
			
		||||
#define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
 | 
			
		||||
#define PyNumber_Int PyNumber_Long
 | 
			
		||||
#endif  // (PY_VERSION_HEX < 0x03000000)
 | 
			
		||||
 | 
			
		||||
// See PEP-353 - this is the "official" test...
 | 
			
		||||
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
 | 
			
		||||
// 2.3 and before have no Py_ssize_t
 | 
			
		||||
typedef int Py_ssize_t;
 | 
			
		||||
#define PyInt_FromSsize_t PyInt_FromLong
 | 
			
		||||
#define PyInt_AsSsize_t PyInt_AsLong
 | 
			
		||||
#define PY_SSIZE_T_MAX INT_MAX
 | 
			
		||||
#define PY_SSIZE_T_MIN INT_MIN
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Py_hash_t was introduced as the size of a pointer in python 3.2 - it
 | 
			
		||||
// was a simple long before that.
 | 
			
		||||
#if PY_VERSION_HEX < 0x03020000
 | 
			
		||||
typedef long Py_hash_t;
 | 
			
		||||
#else
 | 
			
		||||
typedef Py_ssize_t Py_hash_t;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// This only enables runtime checks in debug builds - so we use
 | 
			
		||||
// our own so we can enable it always should we desire...
 | 
			
		||||
#define PyWin_SAFE_DOWNCAST Py_SAFE_DOWNCAST
 | 
			
		||||
 | 
			
		||||
// Lars: for WAVEFORMATEX
 | 
			
		||||
#include "mmsystem.h"
 | 
			
		||||
 | 
			
		||||
// *** NOTE *** FREEZE_PYWINTYPES is deprecated.  It used to be used
 | 
			
		||||
// by the 'freeze' tool, but now py2exe etc do a far better job, and
 | 
			
		||||
// don't require a custom built pywintypes DLL.
 | 
			
		||||
#ifdef FREEZE_PYWINTYPES
 | 
			
		||||
/* The pywintypes module is being included in a frozen .EXE/.DLL */
 | 
			
		||||
#define PYWINTYPES_EXPORT
 | 
			
		||||
#else
 | 
			
		||||
#ifdef BUILD_PYWINTYPES
 | 
			
		||||
/* We are building pywintypesxx.dll */
 | 
			
		||||
#define PYWINTYPES_EXPORT __declspec(dllexport)
 | 
			
		||||
#else
 | 
			
		||||
/* This module uses pywintypesxx.dll */
 | 
			
		||||
#define PYWINTYPES_EXPORT __declspec(dllimport)
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#if defined(DEBUG) || defined(_DEBUG)
 | 
			
		||||
#pragma comment(lib, "pywintypes_d.lib")
 | 
			
		||||
#else
 | 
			
		||||
#pragma comment(lib, "pywintypes.lib")
 | 
			
		||||
#endif  // DEBUG/_DEBUG
 | 
			
		||||
#endif  // _MSC_VER
 | 
			
		||||
#endif  // BUILD_PYWINTYPES
 | 
			
		||||
#endif  // FREEZE_PYWINTYPES
 | 
			
		||||
 | 
			
		||||
#if (PY_VERSION_HEX >= 0x03000000)
 | 
			
		||||
// Py3k uses memoryview object in place of buffer
 | 
			
		||||
extern PYWINTYPES_EXPORT PyObject *PyBuffer_New(Py_ssize_t size);
 | 
			
		||||
extern PYWINTYPES_EXPORT PyObject *PyBuffer_FromMemory(void *buf, Py_ssize_t size);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Formats a python traceback into a character string - result must be free()ed
 | 
			
		||||
PYWINTYPES_EXPORT char *GetPythonTraceback(PyObject *exc_type, PyObject *exc_value, PyObject *exc_tb);
 | 
			
		||||
 | 
			
		||||
#include <tchar.h>
 | 
			
		||||
/*
 | 
			
		||||
** Error/Exception handling
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyObject *PyWinExc_ApiError;
 | 
			
		||||
// Register a Windows DLL that contains the messages in the specified range.
 | 
			
		||||
extern PYWINTYPES_EXPORT BOOL PyWin_RegisterErrorMessageModule(DWORD first, DWORD last, HINSTANCE hmod);
 | 
			
		||||
// Get the previously registered hmodule for an error code.
 | 
			
		||||
extern PYWINTYPES_EXPORT HINSTANCE PyWin_GetErrorMessageModule(DWORD err);
 | 
			
		||||
 | 
			
		||||
/* A global function that sets an API style error (ie, (code, fn, errTest)) */
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWin_SetAPIError(char *fnName, long err = 0);
 | 
			
		||||
 | 
			
		||||
/* Basic COM Exception handling.  The main COM exception object
 | 
			
		||||
   is actually defined here.  However, the most useful functions
 | 
			
		||||
   for raising the exception are still in the COM package.  Therefore,
 | 
			
		||||
   you can use the fn below to raise a basic COM exception - no fancy error
 | 
			
		||||
   messages available, just the HRESULT.  It will, however, _be_ a COM
 | 
			
		||||
   exception, and therefore trappable like any other COM exception
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyObject *PyWinExc_COMError;
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWin_SetBasicCOMError(HRESULT hr);
 | 
			
		||||
 | 
			
		||||
// Given a PyObject (string, Unicode, etc) create a "BSTR" with the value
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsBstr(PyObject *stringObject, BSTR *pResult, BOOL bNoneOK = FALSE,
 | 
			
		||||
                                          DWORD *pResultLen = NULL);
 | 
			
		||||
// And free it when finished.
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeBstr(BSTR pResult);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromBstr(const BSTR bstr, BOOL takeOwnership = FALSE);
 | 
			
		||||
 | 
			
		||||
// Given a string or Unicode object, get WCHAR characters.
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsWCHAR(PyObject *stringObject, WCHAR **pResult, BOOL bNoneOK = FALSE,
 | 
			
		||||
                                           DWORD *pResultLen = NULL);
 | 
			
		||||
// And free it when finished.
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeWCHAR(WCHAR *pResult);
 | 
			
		||||
 | 
			
		||||
// As of Python 2.6, Python switched to 'wchar_t' for unicode, so old
 | 
			
		||||
// win32 structures that still use 'unsigned short' now fail from C++ with
 | 
			
		||||
// VS8 so we provide a couple of helpers.
 | 
			
		||||
// XXX - but, when trying to use VC2003 with x64, the SDK x64 compiler
 | 
			
		||||
// reports itself as 14.00.40310.41 - so this breaks under that compiler
 | 
			
		||||
// Its not clear how to resolve this, but while VS2003 is the default
 | 
			
		||||
// compiler, that is what must work.
 | 
			
		||||
// py2.5 on x64 also needs it, and that is min x64 we support
 | 
			
		||||
// The main difference seems to be whether the compiler has /Zc:wchar_t (Treat wchar_t as a builtin type)
 | 
			
		||||
// on by default, and according to MSDN, _NATIVE_WCHAR_T_DEFINED is the way to check for it
 | 
			
		||||
#ifdef _NATIVE_WCHAR_T_DEFINED
 | 
			
		||||
inline BOOL PyWinObject_AsWCHAR(PyObject *stringObject, unsigned short **pResult, BOOL bNoneOK = FALSE,
 | 
			
		||||
                                DWORD *pResultLen = NULL)
 | 
			
		||||
{
 | 
			
		||||
    return PyWinObject_AsWCHAR(stringObject, (WCHAR **)pResult, bNoneOK, pResultLen);
 | 
			
		||||
}
 | 
			
		||||
inline void PyWinObject_FreeWCHAR(unsigned short *pResult) { PyWinObject_FreeWCHAR((WCHAR *)pResult); }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Given a PyObject (string, Unicode, etc) create a "char *" with the value
 | 
			
		||||
// if pResultLen != NULL, it will be set to the result size NOT INCLUDING
 | 
			
		||||
// TERMINATOR (to be in line with SysStringLen, PyString_*, etc)
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsString(PyObject *stringObject, char **pResult, BOOL bNoneOK = FALSE,
 | 
			
		||||
                                            DWORD *pResultLen = NULL);
 | 
			
		||||
// And free it when finished.
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeString(char *pResult);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeString(WCHAR *pResult);
 | 
			
		||||
 | 
			
		||||
// Automatically freed WCHAR that can be used anywhere WCHAR * is required
 | 
			
		||||
class TmpWCHAR {
 | 
			
		||||
   public:
 | 
			
		||||
    WCHAR *tmp;
 | 
			
		||||
    TmpWCHAR() { tmp = NULL; }
 | 
			
		||||
    TmpWCHAR(WCHAR *t) { tmp = t; }
 | 
			
		||||
    WCHAR *operator=(WCHAR *t)
 | 
			
		||||
    {
 | 
			
		||||
        PyWinObject_FreeWCHAR(tmp);
 | 
			
		||||
        tmp = t;
 | 
			
		||||
        return t;
 | 
			
		||||
    }
 | 
			
		||||
    WCHAR **operator&() { return &tmp; }
 | 
			
		||||
    boolean operator==(WCHAR *t) { return tmp == t; }
 | 
			
		||||
    operator WCHAR *() { return tmp; }
 | 
			
		||||
    ~TmpWCHAR() { PyWinObject_FreeWCHAR(tmp); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Buffer functions that can be used in place of 's#' input format or PyString_AsStringAndSize
 | 
			
		||||
// for 64-bit compatibility and API consistency
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsReadBuffer(PyObject *ob, void **buf, DWORD *buf_len, BOOL bNoneOk = FALSE);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsWriteBuffer(PyObject *ob, void **buf, DWORD *buf_len, BOOL bNoneOk = FALSE);
 | 
			
		||||
 | 
			
		||||
// For 64-bit python compatibility, convert sequence to tuple and check length fits in a DWORD
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinSequence_Tuple(PyObject *obseq, DWORD *len);
 | 
			
		||||
 | 
			
		||||
// an 'int' version (but aren't 'int' and 'DWORD' the same size?
 | 
			
		||||
// Maybe a signed-ness issue?
 | 
			
		||||
inline BOOL PyWinObject_AsReadBuffer(PyObject *ob, void **buf, int *buf_len, BOOL bNoneOk = FALSE)
 | 
			
		||||
{
 | 
			
		||||
    return PyWinObject_AsReadBuffer(ob, buf, (DWORD *)buf_len, bNoneOk);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ANSI/Unicode Support */
 | 
			
		||||
/* If UNICODE defined, will be a BSTR - otherwise a char *
 | 
			
		||||
   Either way - PyWinObject_FreeTCHAR() must be called
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// Helpers with py3k in mind: the result object is always a "core string"
 | 
			
		||||
// object; ie, a string in py2k and unicode in py3k.  Mainly to be used for
 | 
			
		||||
// objects that *must* be that type - tp_str slots, __dict__ items, etc. If
 | 
			
		||||
// Python doesn't *insist* the result be this type, consider using a function
 | 
			
		||||
// that always returns a unicode object (ie, most of the "PyWinObject_From*CHAR"
 | 
			
		||||
// functions)
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinCoreString_FromString(const char *str, Py_ssize_t len = (Py_ssize_t)-1);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinCoreString_FromString(const WCHAR *str, Py_ssize_t len = (Py_ssize_t)-1);
 | 
			
		||||
 | 
			
		||||
#define PyWinObject_FromWCHAR PyWinObject_FromOLECHAR
 | 
			
		||||
 | 
			
		||||
// Converts a series of consecutive null terminated strings into a list
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromMultipleString(WCHAR *multistring);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromMultipleString(char *multistring);
 | 
			
		||||
// Converts a sequence of str/unicode objects into a series of consecutive null-terminated
 | 
			
		||||
//	wide character strings with extra terminating null
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsMultipleString(PyObject *ob, WCHAR **pmultistring, BOOL bNoneOK = TRUE,
 | 
			
		||||
                                                    DWORD *chars_returned = NULL);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeMultipleString(WCHAR *pmultistring);
 | 
			
		||||
 | 
			
		||||
// Converts a sequence of str/unicode objects into a series of consecutive character strings
 | 
			
		||||
//	terminated by double null
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsMultipleString(PyObject *ob, char **pmultistring, BOOL bNoneOK = TRUE,
 | 
			
		||||
                                                    DWORD *chars_returned = NULL);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeMultipleString(char *pmultistring);
 | 
			
		||||
 | 
			
		||||
// Convert a sequence of strings to an array of WCHAR pointers
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeWCHARArray(LPWSTR *wchars, DWORD str_cnt);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsWCHARArray(PyObject *str_seq, LPWSTR **wchars, DWORD *str_cnt,
 | 
			
		||||
                                                BOOL bNoneOK = FALSE);
 | 
			
		||||
 | 
			
		||||
// Convert a sequence of string or unicode objects to an array of char *
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeCharArray(char **pchars, DWORD str_cnt);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsCharArray(PyObject *str_seq, char ***pchars, DWORD *str_cnt, BOOL bNoneOK = FALSE);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromOLECHAR(const OLECHAR *str);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromOLECHAR(const OLECHAR *str, int numChars);
 | 
			
		||||
 | 
			
		||||
// String support for buffers allocated via a function of your choice.
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsPfnAllocatedWCHAR(PyObject *stringObject, void *(*pfnAllocator)(ULONG),
 | 
			
		||||
                                                       WCHAR **ppResult, BOOL bNoneOK = FALSE,
 | 
			
		||||
                                                       DWORD *pResultLen = NULL);
 | 
			
		||||
 | 
			
		||||
#ifdef UNICODE
 | 
			
		||||
// XXX - "AsTCHAR" functions should all die - the type of the Python object
 | 
			
		||||
// being returned should not depend on UNICODE or not.
 | 
			
		||||
#define PyWinObject_AsTCHAR PyWinObject_AsWCHAR
 | 
			
		||||
#define PyWinObject_FreeTCHAR PyWinObject_FreeWCHAR
 | 
			
		||||
#define PyWinObject_FromTCHAR PyWinObject_FromOLECHAR
 | 
			
		||||
#else /* not UNICODE */
 | 
			
		||||
#define PyWinObject_AsTCHAR PyWinObject_AsString
 | 
			
		||||
#define PyWinObject_FreeTCHAR PyWinObject_FreeString
 | 
			
		||||
 | 
			
		||||
// PyWinObject_FromTCHAR in a non-unicode build still depends on py3k or not:
 | 
			
		||||
// py2x a string object is returned (no conversions).  py3x a unicode object
 | 
			
		||||
// is returned (ie, the string is decoded)
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromTCHAR(const char *str, Py_ssize_t len = (Py_ssize_t)-1);
 | 
			
		||||
 | 
			
		||||
#endif  // UNICODE
 | 
			
		||||
 | 
			
		||||
// String support for buffers allocated via CoTaskMemAlloc and CoTaskMemFree
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsTaskAllocatedWCHAR(PyObject *stringObject, WCHAR **ppResult, BOOL bNoneOK = FALSE,
 | 
			
		||||
                                                        DWORD *pResultLen = NULL);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeTaskAllocatedWCHAR(WCHAR *str);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeString(char *str);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeString(WCHAR *str);
 | 
			
		||||
 | 
			
		||||
// Copy null terminated string with same allocator as PyWinObject_AsWCHAR, etc
 | 
			
		||||
PYWINTYPES_EXPORT WCHAR *PyWin_CopyString(const WCHAR *input);
 | 
			
		||||
PYWINTYPES_EXPORT char *PyWin_CopyString(const char *input);
 | 
			
		||||
 | 
			
		||||
// Pointers.
 | 
			
		||||
// Substitute for Python's inconsistent PyLong_AsVoidPtr
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinLong_AsVoidPtr(PyObject *ob, void **pptr);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinLong_FromVoidPtr(const void *ptr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** LARGE_INTEGER objects
 | 
			
		||||
*/
 | 
			
		||||
// AsLARGE_INTEGER takes either int or long
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsLARGE_INTEGER(PyObject *ob, LARGE_INTEGER *pResult);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsULARGE_INTEGER(PyObject *ob, ULARGE_INTEGER *pResult);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromLARGE_INTEGER(const LARGE_INTEGER &val);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromULARGE_INTEGER(const ULARGE_INTEGER &val);
 | 
			
		||||
// Helpers that take a Py_LONG_LONG, but (a) have pywin32 consistent signatures
 | 
			
		||||
// and (b) handle int *and* long (where Python only starts doing that in the
 | 
			
		||||
// PyLong_* APIs post 2.4)
 | 
			
		||||
// We also happen to know a LARGE_INTEGER is an __int64, so do it the easy way
 | 
			
		||||
#define PyWinObject_AsPY_LONG_LONG(ob, pResult) PyWinObject_AsLARGE_INTEGER((ob), (LARGE_INTEGER *)(pResult))
 | 
			
		||||
#define PyWinObject_AsUPY_LONG_LONG(ob, pResult) PyWinObject_AsULARGE_INTEGER((ob), (ULARGE_INTEGER *)(pResult))
 | 
			
		||||
#define PyWinObject_FromPY_LONG_LONG(val) PyWinObject_FromLARGE_INTEGER((LARGE_INTEGER)val)
 | 
			
		||||
#define PyWinObject_FromUPY_LONG_LONG(val) PyWinObject_FromULARGE_INTEGER((ULARGE_INTEGER)val)
 | 
			
		||||
 | 
			
		||||
// A DWORD_PTR and ULONG_PTR appear to mean "integer long enough to hold a pointer"
 | 
			
		||||
// It is *not* actually a pointer (but is the same size as a pointer)
 | 
			
		||||
inline PyObject *PyWinObject_FromULONG_PTR(ULONG_PTR v) { return PyWinLong_FromVoidPtr((void *)v); }
 | 
			
		||||
inline BOOL PyWinLong_AsULONG_PTR(PyObject *ob, ULONG_PTR *r) { return PyWinLong_AsVoidPtr(ob, (void **)r); }
 | 
			
		||||
 | 
			
		||||
inline PyObject *PyWinObject_FromDWORD_PTR(DWORD_PTR v) { return PyLong_FromVoidPtr((void *)v); }
 | 
			
		||||
inline BOOL PyWinLong_AsDWORD_PTR(PyObject *ob, DWORD_PTR *r) { return PyWinLong_AsVoidPtr(ob, (void **)r); }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** OVERLAPPED Object and API
 | 
			
		||||
*/
 | 
			
		||||
class PyOVERLAPPED;                                      // forward declare
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyOVERLAPPEDType;  // the Type for PyOVERLAPPED
 | 
			
		||||
#define PyOVERLAPPED_Check(ob) ((ob)->ob_type == &PyOVERLAPPEDType)
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsOVERLAPPED(PyObject *ob, OVERLAPPED **ppOverlapped, BOOL bNoneOK = TRUE);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsPyOVERLAPPED(PyObject *ob, PyOVERLAPPED **ppOverlapped, BOOL bNoneOK = TRUE);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromOVERLAPPED(const OVERLAPPED *pOverlapped);
 | 
			
		||||
 | 
			
		||||
// A global function that can work as a module method for making an OVERLAPPED object.
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewOVERLAPPED(PyObject *self, PyObject *args);
 | 
			
		||||
 | 
			
		||||
#ifndef NO_PYWINTYPES_IID
 | 
			
		||||
/*
 | 
			
		||||
** IID/GUID support
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyIIDType;  // the Type for PyIID
 | 
			
		||||
#define PyIID_Check(ob) ((ob)->ob_type == &PyIIDType)
 | 
			
		||||
 | 
			
		||||
// Given an object repring a CLSID (either PyIID or string), fill the CLSID.
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsIID(PyObject *obCLSID, CLSID *clsid);
 | 
			
		||||
 | 
			
		||||
// return a native PyIID object representing an IID
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromIID(const IID &riid);
 | 
			
		||||
 | 
			
		||||
// return a string/Unicode object representing an IID
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinCoreString_FromIID(const IID &riid);
 | 
			
		||||
 | 
			
		||||
// A global function that can work as a module method for making an IID object.
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewIID(PyObject *self, PyObject *args);
 | 
			
		||||
#endif /*NO_PYWINTYPES_IID */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** TIME support
 | 
			
		||||
*/
 | 
			
		||||
// The NO_PYWINTYPES_TIME define was initially used for CE builds.  We now
 | 
			
		||||
// use that symbol to mean "do we include our old, crap, custom time object?"
 | 
			
		||||
// If not defined, we exclusively support datetime objects via the C API.
 | 
			
		||||
// (Note py2.3 doesn't have a C API, so will not currently build with
 | 
			
		||||
// NO_PYWINTYPES_TIME defined.)
 | 
			
		||||
// TODO: If both builtin and datetime objects are enabled, we will enable
 | 
			
		||||
// some transitional period using something like
 | 
			
		||||
// pywintypes.__future_datatime__, but for now this is defined purely at build
 | 
			
		||||
// time.
 | 
			
		||||
#if (PY_VERSION_HEX >= 0x03000000)
 | 
			
		||||
#define NO_PYWINTYPES_TIME
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Python 2.3 doesn't have C Api for datetime, so can't have our new funky
 | 
			
		||||
// support.
 | 
			
		||||
#if (PY_VERSION_HEX >= 0x02040000)
 | 
			
		||||
#define PYWIN_HAVE_DATETIME_CAPI
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// XXX - fixme - ack - we don't yet like *both* defines existing - and for now
 | 
			
		||||
// its only enabled in py3k
 | 
			
		||||
#if (PY_VERSION_HEX < 0x03000000)
 | 
			
		||||
#undef PYWIN_HAVE_DATETIME_CAPI
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromSYSTEMTIME(const SYSTEMTIME &t);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromFILETIME(const FILETIME &t);
 | 
			
		||||
 | 
			
		||||
// Converts a TimeStamp, which is in 100 nanosecond units like a FILETIME
 | 
			
		||||
// TimeStamp is actually defined as a LARGE_INTEGER, so this function will also
 | 
			
		||||
// accept Windows security "TimeStamp" objects directly - however, we use a
 | 
			
		||||
// LARGE_INTEGER prototype to avoid pulling in the windows security headers.
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromTimeStamp(const LARGE_INTEGER &t);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinTimeObject_Fromtime_t(time_t t);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromDATE(DATE t);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsDATE(PyObject *ob, DATE *pDate);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsFILETIME(PyObject *ob, FILETIME *pDate);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsSYSTEMTIME(PyObject *ob, SYSTEMTIME *pDate);
 | 
			
		||||
 | 
			
		||||
// A global function that can work as a module method for making a time object.
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewTime(PyObject *self, PyObject *args);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewTimeStamp(PyObject *self, PyObject *args);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinTime_Check(PyObject *ob);
 | 
			
		||||
 | 
			
		||||
#ifndef NO_PYWINTYPES_TIME
 | 
			
		||||
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyTimeType;  // the Type for PyTime
 | 
			
		||||
#define PyWinTime_CHECK(ob) ((ob)->ob_type == &PyTimeType)
 | 
			
		||||
 | 
			
		||||
#endif  // NO_PYWINTYPES_TIME
 | 
			
		||||
 | 
			
		||||
// functions to return WIN32_FIND_DATA tuples, used in shell, win32api, and win32file
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyObject_FromWIN32_FIND_DATAA(WIN32_FIND_DATAA *pData);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyObject_FromWIN32_FIND_DATAW(WIN32_FIND_DATAW *pData);
 | 
			
		||||
#ifdef UNICODE
 | 
			
		||||
#define PyObject_FromWIN32_FIND_DATA PyObject_FromWIN32_FIND_DATAW
 | 
			
		||||
#else
 | 
			
		||||
#define PyObject_FromWIN32_FIND_DATA PyObject_FromWIN32_FIND_DATAA
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// POINT tuple, used in win32api_display.cpp and win32gui.i
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsPOINT(PyObject *obpoint, LPPOINT ppoint);
 | 
			
		||||
 | 
			
		||||
// IO_COUNTERS dict, used in win32process and win32job
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromIO_COUNTERS(PIO_COUNTERS pioc);
 | 
			
		||||
 | 
			
		||||
// Make an array of DWORD's from a sequence of Python ints
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsDWORDArray(PyObject *obdwords, DWORD **pdwords, DWORD *item_cnt,
 | 
			
		||||
                                                BOOL bNoneOk = TRUE);
 | 
			
		||||
 | 
			
		||||
// Conversion for resource id/name and class atom
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsResourceIdA(PyObject *ob, char **presource_id, BOOL bNoneOK = FALSE);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsResourceIdW(PyObject *ob, WCHAR **presource_id, BOOL bNoneOK = FALSE);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeResourceId(char *resource_id);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWinObject_FreeResourceId(WCHAR *resource_id);
 | 
			
		||||
#ifdef UNICODE
 | 
			
		||||
#define PyWinObject_AsResourceId PyWinObject_AsResourceIdW
 | 
			
		||||
#else
 | 
			
		||||
#define PyWinObject_AsResourceId PyWinObject_AsResourceIdA
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// WPARAM and LPARAM conversion
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsPARAM(PyObject *ob, WPARAM *pparam);
 | 
			
		||||
inline PyObject *PyWinObject_FromPARAM(WPARAM param) { return PyWinObject_FromULONG_PTR(param); }
 | 
			
		||||
inline BOOL PyWinObject_AsPARAM(PyObject *ob, LPARAM *pparam) { return PyWinObject_AsPARAM(ob, (WPARAM *)pparam); }
 | 
			
		||||
inline PyObject *PyWinObject_FromPARAM(LPARAM param) { return PyWinObject_FromULONG_PTR(param); }
 | 
			
		||||
 | 
			
		||||
// RECT conversions
 | 
			
		||||
// @object PyRECT|Tuple of 4 ints defining a rectangle: (left, top, right, bottom)
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsRECT(PyObject *obrect, LPRECT prect);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromRECT(LPRECT prect);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** SECURITY_ATTRIBUTES support
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PySECURITY_ATTRIBUTESType;
 | 
			
		||||
#define PySECURITY_ATTRIBUTES_Check(ob) ((ob)->ob_type == &PySECURITY_ATTRIBUTESType)
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyDEVMODEAType;
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyDEVMODEWType;
 | 
			
		||||
 | 
			
		||||
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, PDEVMODEA *ppDEVMODE, BOOL bNoneOK = TRUE);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsDEVMODE(PyObject *ob, PDEVMODEW *ppDEVMODE, BOOL bNoneOK);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromDEVMODE(PDEVMODEA);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromDEVMODE(PDEVMODEW);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** WAVEFORMATEX support
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewWAVEFORMATEX(PyObject *self, PyObject *args);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromWAVEFROMATEX(const WAVEFORMATEX &wfx);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsWAVEFORMATEX(PyObject *ob, WAVEFORMATEX **ppWAVEFORMATEX, BOOL bNoneOK = TRUE);
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyWAVEFORMATEXType;
 | 
			
		||||
#define PyWAVEFORMATEX_Check(ob) ((ob)->ob_type == &PyWAVEFORMATEXType)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** SECURITY_DESCRIPTOR support
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PySECURITY_DESCRIPTORType;
 | 
			
		||||
#define PySECURITY_DESCRIPTOR_Check(ob) ((ob)->ob_type == &PySECURITY_DESCRIPTORType)
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewSECURITY_DESCRIPTOR(PyObject *self, PyObject *args);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsSECURITY_DESCRIPTOR(PyObject *ob, PSECURITY_DESCRIPTOR *ppSECURITY_DESCRIPTOR,
 | 
			
		||||
                                                         BOOL bNoneOK = TRUE);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromSECURITY_DESCRIPTOR(PSECURITY_DESCRIPTOR psd);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT BOOL _MakeAbsoluteSD(PSECURITY_DESCRIPTOR psd_relative, PSECURITY_DESCRIPTOR *ppsd_absolute);
 | 
			
		||||
PYWINTYPES_EXPORT void FreeAbsoluteSD(PSECURITY_DESCRIPTOR psd);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** SID support
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PySIDType;
 | 
			
		||||
#define PySID_Check(ob) ((ob)->ob_type == &PySIDType)
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewSID(PyObject *self, PyObject *args);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsSID(PyObject *ob, PSID *ppSID, BOOL bNoneOK = FALSE);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromSID(PSID pSID);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** ACL support
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyACLType;
 | 
			
		||||
#define PyACL_Check(ob) ((ob)->ob_type == &PyACLType)
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewACL(PyObject *self, PyObject *args);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsACL(PyObject *ob, PACL *ppACL, BOOL bNoneOK = FALSE);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** Win32 HANDLE wrapper - any handle closable by "CloseHandle()"
 | 
			
		||||
*/
 | 
			
		||||
extern PYWINTYPES_EXPORT PyTypeObject PyHANDLEType;  // the Type for PyHANDLE
 | 
			
		||||
#define PyHANDLE_Check(ob) ((ob)->ob_type == &PyHANDLEType)
 | 
			
		||||
 | 
			
		||||
// Convert an object to a HANDLE - None is always OK, as are ints, etc.
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsHANDLE(PyObject *ob, HANDLE *pRes);
 | 
			
		||||
// For handles that use PyHANDLE.
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromHANDLE(HANDLE h);
 | 
			
		||||
// For handles that aren't returned as PyHANDLE or a subclass thereof (HDC, HWND, etc).
 | 
			
		||||
// Return as python ints or longs
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinLong_FromHANDLE(HANDLE h);
 | 
			
		||||
 | 
			
		||||
// A global function that can work as a module method for making a HANDLE object.
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinMethod_NewHANDLE(PyObject *self, PyObject *args);
 | 
			
		||||
 | 
			
		||||
// A global function that does the right thing wrt closing a "handle".
 | 
			
		||||
// The object can be either a PyHANDLE or an integer.
 | 
			
		||||
// If result is FALSE, a Python error is all setup (cf PyHANDLE::Close(), which doesnt set the Python error)
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_CloseHANDLE(PyObject *obHandle);
 | 
			
		||||
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsHKEY(PyObject *ob, HKEY *pRes);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromHKEY(HKEY h);
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_CloseHKEY(PyObject *obHandle);
 | 
			
		||||
 | 
			
		||||
// MSG structure keeps coming up...
 | 
			
		||||
PYWINTYPES_EXPORT BOOL PyWinObject_AsMSG(PyObject *ob, MSG *pMsg);
 | 
			
		||||
PYWINTYPES_EXPORT PyObject *PyWinObject_FromMSG(const MSG *pMsg);
 | 
			
		||||
 | 
			
		||||
#include "winsock.h"
 | 
			
		||||
/*
 | 
			
		||||
** SOCKET support.
 | 
			
		||||
*/
 | 
			
		||||
PYWINTYPES_EXPORT
 | 
			
		||||
BOOL PySocket_AsSOCKET
 | 
			
		||||
    //-------------------------------------------------------------------------
 | 
			
		||||
    // Helper function for dealing with socket arguments.
 | 
			
		||||
    (PyObject *obSocket,
 | 
			
		||||
     // [in] Python object being converted into a SOCKET handle.
 | 
			
		||||
     SOCKET *ps
 | 
			
		||||
     // [out] Returned socket handle
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** Other Utilities
 | 
			
		||||
*/
 | 
			
		||||
// ----------------------------------------------------------------------
 | 
			
		||||
// WARNING - NEVER EVER USE new() ON THIS CLASS
 | 
			
		||||
// This class can be used as a local variable, typically in a Python/C
 | 
			
		||||
// function, and can be passed whereever a TCHAR/WCHAR is expected.
 | 
			
		||||
// Typical Usage:
 | 
			
		||||
// PyWin_AutoFreeBstr arg;
 | 
			
		||||
// PyArg_ParseTuple("O", &obStr);
 | 
			
		||||
// PyWinObject_AsAutoFreeBstr(obStr, &arg);
 | 
			
		||||
// CallTheFunction(arg); // Will correctly pass BSTR/OLECHAR
 | 
			
		||||
// -- when the function goes out of scope, the string owned by "arg" will
 | 
			
		||||
// -- automatically be freed.
 | 
			
		||||
// ----------------------------------------------------------------------
 | 
			
		||||
class PYWINTYPES_EXPORT PyWin_AutoFreeBstr {
 | 
			
		||||
   public:
 | 
			
		||||
    PyWin_AutoFreeBstr(BSTR bstr = NULL);
 | 
			
		||||
    ~PyWin_AutoFreeBstr();
 | 
			
		||||
    void SetBstr(BSTR bstr);
 | 
			
		||||
    operator BSTR() { return m_bstr; }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    BSTR m_bstr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline BOOL PyWinObject_AsAutoFreeBstr(PyObject *stringObject, PyWin_AutoFreeBstr *pResult, BOOL bNoneOK = FALSE)
 | 
			
		||||
{
 | 
			
		||||
    if (bNoneOK && stringObject == Py_None) {
 | 
			
		||||
        pResult->SetBstr(NULL);
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    BSTR bs;
 | 
			
		||||
    if (!PyWinObject_AsBstr(stringObject, &bs, bNoneOK))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    pResult->SetBstr(bs);
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ----------------------------------------------------------------------
 | 
			
		||||
//
 | 
			
		||||
// THREAD MANAGEMENT
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// ### need to rename the PYCOM_ stuff soon...
 | 
			
		||||
 | 
			
		||||
// We have 2 discrete locks in use (when no free-threaded is used, anyway).
 | 
			
		||||
// The first type of lock is the global Python lock.  This is the standard lock
 | 
			
		||||
// in use by Python, and must be used as documented by Python.  Specifically, no
 | 
			
		||||
// 2 threads may _ever_ call _any_ Python code (including INCREF/DECREF) without
 | 
			
		||||
// first having this thread lock.
 | 
			
		||||
//
 | 
			
		||||
// The second type of lock is a "global framework lock".  This lock is simply a
 | 
			
		||||
// critical section, and used whenever 2 threads of C code need access to global
 | 
			
		||||
// data.  This is different than the Python lock - this lock is used when no Python
 | 
			
		||||
// code can ever be called by the threads, but the C code still needs thread-safety.
 | 
			
		||||
 | 
			
		||||
// We also supply helper classes which make the usage of these locks a one-liner.
 | 
			
		||||
 | 
			
		||||
// The "framework" lock, implemented as a critical section.
 | 
			
		||||
PYWINTYPES_EXPORT void PyWin_AcquireGlobalLock(void);
 | 
			
		||||
PYWINTYPES_EXPORT void PyWin_ReleaseGlobalLock(void);
 | 
			
		||||
 | 
			
		||||
// Helper class for the DLL global lock.
 | 
			
		||||
//
 | 
			
		||||
// This class magically waits for the Win32/COM framework global lock, and releases it
 | 
			
		||||
// when finished.
 | 
			
		||||
// NEVER new one of these objects - only use on the stack!
 | 
			
		||||
class CEnterLeaveFramework {
 | 
			
		||||
   public:
 | 
			
		||||
    CEnterLeaveFramework() { PyWin_AcquireGlobalLock(); }
 | 
			
		||||
    ~CEnterLeaveFramework() { PyWin_ReleaseGlobalLock(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Python thread-lock stuff.  Free-threading patches use different semantics, but
 | 
			
		||||
// these are abstracted away here...
 | 
			
		||||
#ifndef FORCE_NO_FREE_THREAD
 | 
			
		||||
#ifdef WITH_FREE_THREAD
 | 
			
		||||
#define PYCOM_USE_FREE_THREAD
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef PYCOM_USE_FREE_THREAD
 | 
			
		||||
#include <threadstate.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <pystate.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Helper class for Enter/Leave Python
 | 
			
		||||
//
 | 
			
		||||
// This class magically waits for the Python global lock, and releases it
 | 
			
		||||
// when finished.
 | 
			
		||||
 | 
			
		||||
// Nested invocations will deadlock, so be careful.
 | 
			
		||||
 | 
			
		||||
// NEVER new one of these objects - only use on the stack!
 | 
			
		||||
#ifndef PYCOM_USE_FREE_THREAD
 | 
			
		||||
extern PYWINTYPES_EXPORT PyInterpreterState *PyWin_InterpreterState;
 | 
			
		||||
extern PYWINTYPES_EXPORT BOOL PyWinThreadState_Ensure();
 | 
			
		||||
extern PYWINTYPES_EXPORT void PyWinThreadState_Free();
 | 
			
		||||
extern PYWINTYPES_EXPORT void PyWinThreadState_Clear();
 | 
			
		||||
extern PYWINTYPES_EXPORT void PyWinInterpreterLock_Acquire();
 | 
			
		||||
extern PYWINTYPES_EXPORT void PyWinInterpreterLock_Release();
 | 
			
		||||
 | 
			
		||||
extern PYWINTYPES_EXPORT int PyWinGlobals_Ensure();
 | 
			
		||||
extern PYWINTYPES_EXPORT void PyWinGlobals_Free();
 | 
			
		||||
#else
 | 
			
		||||
#define PyWinThreadState_Ensure PyThreadState_Ensure
 | 
			
		||||
#define PyWinThreadState_Free PyThreadState_Free
 | 
			
		||||
#define PyWinThreadState_Clear PyThreadState_ClearExc
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern PYWINTYPES_EXPORT void PyWin_MakePendingCalls();
 | 
			
		||||
 | 
			
		||||
class CEnterLeavePython {
 | 
			
		||||
   public:
 | 
			
		||||
    CEnterLeavePython() { acquire(); }
 | 
			
		||||
    void acquire(void)
 | 
			
		||||
    {
 | 
			
		||||
        state = PyGILState_Ensure();
 | 
			
		||||
        released = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
    ~CEnterLeavePython() { release(); }
 | 
			
		||||
    void release(void)
 | 
			
		||||
    {
 | 
			
		||||
        if (!released) {
 | 
			
		||||
            PyGILState_Release(state);
 | 
			
		||||
            released = TRUE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    PyGILState_STATE state;
 | 
			
		||||
    BOOL released;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A helper for simple exception handling.
 | 
			
		||||
// try/__try
 | 
			
		||||
#if defined(__MINGW32__) || defined(MAINWIN)
 | 
			
		||||
#define PYWINTYPES_TRY try
 | 
			
		||||
#else
 | 
			
		||||
#define PYWINTYPES_TRY __try
 | 
			
		||||
#endif /* MAINWIN */
 | 
			
		||||
 | 
			
		||||
// catch/__except
 | 
			
		||||
#if defined(__MINGW32__) || defined(MAINWIN)
 | 
			
		||||
#define PYWINTYPES_EXCEPT catch (...)
 | 
			
		||||
#else
 | 
			
		||||
#define PYWINTYPES_EXCEPT __except (EXCEPTION_EXECUTE_HANDLER)
 | 
			
		||||
#endif
 | 
			
		||||
// End of exception helper macros.
 | 
			
		||||
 | 
			
		||||
// Class to hold a temporary reference that decrements itself
 | 
			
		||||
class TmpPyObject {
 | 
			
		||||
   public:
 | 
			
		||||
    PyObject *tmp;
 | 
			
		||||
    TmpPyObject() { tmp = NULL; }
 | 
			
		||||
    TmpPyObject(PyObject *ob) { tmp = ob; }
 | 
			
		||||
    PyObject *operator=(PyObject *ob)
 | 
			
		||||
    {
 | 
			
		||||
        Py_XDECREF(tmp);
 | 
			
		||||
        tmp = ob;
 | 
			
		||||
        return tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boolean operator==(PyObject *ob) { return tmp == ob; }
 | 
			
		||||
    operator PyObject *() { return tmp; }
 | 
			
		||||
    ~TmpPyObject() { Py_XDECREF(tmp); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif  // __PYWINTYPES_H__
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue