En Wed, 21 Mar 2007 03:35:09 -0300, John Pye <[EMAIL PROTECTED]> escribió:

> Gabriel, if you think you can make an example that works, that would
> be great. I'm afraid I feel a bit out of my depth and don't have much
> confidence in this idea.

Try this. It's based on the example_nt extension module.

--- begin example.c ---
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <windows.h>
#include "Python.h"

static void externalfunction(FILE* f)
{
        // This is a "fake" external function that receives a FILE*
        printf("In externalfunction\n");
        fprintf(f, "Hello from externalfunction!\n");
}

static void wrapper(DWORD osfhandle)
{
        // This is a wrapper around externalfunction; receives an OS handle
        // for an open file, builds a FILE structure, and calls externalfunction
        FILETIME lw;
        SYSTEMTIME st;
        FILE* f;

        // This call is just to show that osfhandle is actually a Windows handle
        // as if one had used CreateFile(...) by example
        printf("Using osfhandle with GetFileTime\n");
        GetFileTime((HANDLE)osfhandle, NULL, NULL, &lw);
        FileTimeToSystemTime(&lw, &st);
        printf("LastWrite %d-%d-%d %02d:%02d:%02d.%03d\n", st.wYear, st.wMonth, 
 
st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

        // Now build a FILE struct from the received handle
        f = fdopen(_open_osfhandle(osfhandle,_O_APPEND),"a");
        externalfunction(f);
        fflush(f); // ensure all buffers are written
}

static PyObject *
filetest(PyObject *self, PyObject *args)
{
        DWORD handle;

        if (!PyArg_ParseTuple(args, "I", &handle))
                return NULL;
        printf("Received handle: %d\n", handle);
        wrapper(handle);
        printf("Done\n");
        Py_INCREF(Py_None);
        return Py_None;
}

static PyMethodDef example_methods[] = {
        {"filetest", filetest, 1, "filetest doc string"},
        {NULL, NULL}
};

void
initexample(void)
{
        Py_InitModule("example", example_methods);
}
--- end example.c ---

--- begin test.py ---
f = open("output.txt","w")
f.write("Hello from python!\n")
# ensure all buffers are written before calling the external function
f.flush()

import msvcrt
fh = msvcrt.get_osfhandle(f.fileno())
print "handle=",fh

import example
# calling example.filetest using the OS handle
example.filetest(fh)
f.close()

f = open("output.txt","r")
print "output.txt:"
print f.read()
f.close()
--- test.py ---

Build example.dll and rename it example.pyd; copy test.py to the same  
directory.
Running test.py gives:

C:\APPS\Python24\PYTHON~1.2\TEST_M~1\Release>python24 test.py
handle= 1988
Received handle: 1988
Using osfhandle with GetFileTime
LastWrite 2007-3-23 04:25:08.000
In externalfunction
Done
output.txt:
Hello from python!
Hello from externalfunction!

-- 
Gabriel Genellina

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to