mani sabri wrote:
> I want to run a Python shell from a DllMain() function.
>   

It isn't safe to do this much processing in a DllMain.  There is a thing 
called the "loader lock" that is held while DllMain is called, and it 
can prevent you from loading other DLLs.  You might try spinning off a 
thread to do your real work.


> This is what I came up with so far:
>
> BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID
> lpReserved)
> {
>       //----
>       switch(ul_reason_for_call)
>       {
>       case DLL_PROCESS_ATTACH:
>       {
>       if (!Py_IsInitialized())
>       {                               
>       BOOL res = AllocConsole();
>                               
>       //I was going to use the handles but I heard its not the way to do
> that
>       //HANDLE OutHand = GetStdHandle(STD_OUTPUT_HANDLE);
>       //HANDLE InHand = GetStdHandle(STD_INPUT_HANDLE);
>       //HANDLE ErrHand = GetStdHandle(STD_ERROR_HANDLE);
>
>       //Redirecting console
>       freopen("CONOUT$","w",stdout);
>       freopen("CONIN$","w",stdin);
>       freopen("CONERR$","w",stderr);
>   

Do you really think "w" is correct for all three of those?

>       //the printf prints on the new console after redirection
>       printf("test");
>       
>       //opening stdout and stdin files to pass to python for redirection
>       FILE* afile = fopen("CONOUT$", "w+");
>       FILE* bfile = fopen("CONIN$", "w+");
>   

Again, do you really think you want "w+ for both of these?  How much 
writing will you do to stdin?

>       Py_Initialize();
>       if (!Py_IsInitialized()) return(FALSE);
>
>       //the bellow lines , instead of redirecting python crashes the dll
>       PySys_SetObject("stdout", PyFile_FromFile(afile, "test","wb",
> fclose)); 
>       PySys_SetObject("stdin", PyFile_FromFile(bfile, "CONIN$","wb",
> fclose));
>   

Again, you're probably going to want to read from stdin, not write to 
it.  And you don't really need to do the fopen yourself:

    PyFileObject* xout = PyFile_FromString( "CONOUT$", "wb" );
    PyFileObject* xin = PyFile_FromString( "CONIN$", "rb" );
    PySys_SetObject( "stdout", xout );
    PySys_SetObject( "__stdout__", xout );
    PySys_SetObject( "stdin", xin );
    PySys_SetObject( "__stdin__", xin );

-- 
Tim Roberts, [EMAIL PROTECTED]
Providenza & Boekelheide, Inc.

_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to