I tried that change and get the exact same error message. I found the code sending the error message in pywin32/win32/src/win32service.i I've extracted what I think are the relevant snippets:
1675 // @flag SERVICE_CONFIG_FAILURE_ACTIONS|Dict representing a SERVICE_FAILURE_ACTIONS struct 1676 case SERVICE_CONFIG_FAILURE_ACTIONS:{ 1677 SERVICE_FAILURE_ACTIONSW buf; 1678 if (!PyWinObject_AsSERVICE_FAILURE_ACTIONS(obinfo, &buf)) 1679 return NULL; 1680 bsuccess=(*fpChangeServiceConfig2)(hService, level, (LPVOID)&buf); 1681 PyWinObject_FreeSERVICE_FAILURE_ACTIONS(&buf); 1682 break; 1683 } Which calls into this: 1584 BOOL PyWinObject_AsSERVICE_FAILURE_ACTIONS(PyObject *obinfo, LPSERVICE_FAILURE_ACTIONSW psfa) 1585 { 1586 static char *sfa_keys[]={"ResetPeriod","RebootMsg","Command","Actions",0}; 1587 static char *err="SERVICE_FAILURE_ACTIONS must be a dictionary containing {'ResetPeriod':int,'RebootMsg':unicode,'lpCommand':unicode,'Actions':sequence of 2 tuples(int,int)"; 1588 PyObject *dummy_tuple, *obActions, *obRebootMsg, *obCommand; 1589 BOOL ret; 1590 ZeroMemory(psfa, sizeof(SERVICE_FAILURE_ACTIONSW)); 1591 if (!PyDict_Check(obinfo)){ 1592 PyErr_SetString(PyExc_TypeError,err); 1593 return FALSE; 1594 } 1595 dummy_tuple=PyTuple_New(0); 1596 if (dummy_tuple==NULL) 1597 return FALSE; 1598 ret=PyArg_ParseTupleAndKeywords(dummy_tuple, obinfo, "lOOO:SERVICE_FAILURE_ACTIONS", sfa_keys, 1599 &psfa->dwResetPeriod, &obRebootMsg, &obCommand, &obActions); 1600 Py_DECREF(dummy_tuple); 1601 if (!ret){ 1602 PyErr_Clear(); 1603 PyErr_SetString(PyExc_TypeError,err); 1604 return FALSE; 1605 } 1606 if (PyWinObject_AsWCHAR(obRebootMsg, &psfa->lpRebootMsg, TRUE) 1607 &&PyWinObject_AsWCHAR(obCommand, &psfa->lpCommand, TRUE) 1608 &&PyWinObject_AsSC_ACTIONS(obActions,&psfa->lpsaActions, &psfa->cActions)) 1609 return TRUE; 1610 PyWinObject_FreeSERVICE_FAILURE_ACTIONS(psfa); 1611 return FALSE; 1612 } So, I'm confused because I think I'm correctly passing it a dict object, yet it appears that PyDict_Check is disagreeing and saying that it is not a dict object. What am I missing? A On Tue, Aug 9, 2011 at 7:27 PM, Randy Syring <rsyr...@gmail.com> wrote: > This is a shot in the dark, but if you are on python 2, then: > > 'RebootMsg': '', > 'lpCommand': '', > > Is two strings, not unicode. Maybe: > > 'RebootMsg': u'', > 'lpCommand': u'', > > > -------------------------------------- > Randy Syring > Intelicom > Direct: 502-276-0459 > Office: 502-212-9913 > > For the wages of sin is death, but the > free gift of God is eternal life in > Christ Jesus our Lord (Rom 6:23) > > > On 08/09/2011 08:56 PM, Andrew Hammond wrote: > > I did some more hunting around and now have the following: > > hscm = > win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS) > try: > hs = win32serviceutil.SmartOpenService(hscm, cls._svc_name_, > win32service.SERVICE_ALL_ACCESS) > try: > service_failure_actions = { > 'ResetPeriod': 6000000, # Time in seconds after which to > reset the failure count to zero. > 'RebootMsg': '', > 'lpCommand': '', > 'Actions': [(win32service.SC_ACTION_RESTART, 60000), > (win32service.SC_ACTION_RESTART, 60000)] > } > win32service.ChangeServiceConfig2(hs, > win32service.SERVICE_CONFIG_FAILURE_ACTIONS, service_failure_actions) > finally: > win32service.CloseServiceHandle(hs) > finally: > win32service.CloseServiceHandle(hscm) > > However, I'm getting the following error message: > > TypeError: SERVICE_FAILURE_ACTIONS must be a dictionary containing > {'ResetPeriod':int,'RebootMsg':unicode,'lpCommand':unicode,'Actions':sequence > of 2 tuples(int,int) > > Which I think is what I'm feeding it. Can someone please tell me what I'm > doing wrong? > > A > > On Mon, Aug 8, 2011 at 7:06 PM, Andrew Hammond < > andrew.george.hamm...@gmail.com> wrote: > >> I am trying to control the behavior of a service with regards to failure >> handling as described here: >> http://blogs.msdn.com/b/jcalev/archive/2008/01/10/some-tricks-with-service-restart-logic.aspx >> >> I have done some reading and have the following snippet of code that I >> think is going in the right direction. However I don't know how to create >> the action list. I suspect that it should be an array of unsigned long ints, >> but... ??? >> >> >> hscm = >> win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS) >> >> try: >> hs = SmartOpenService(hscm, cls._svc_name_, >> win32service.SERVICE_ALL_ACCESS) >> try: >> # What's the pythonic way to create these??? >> action1 = Action() >> action1.Type = win32service.SC_ACTION_RESTART >> action1.Delay = 600 # 10 minutes? >> >> action2 = Action() >> action2.Type = win32service.SC_ACTION_RESTART >> action2.Delay = 600 >> >> action3 = Action() >> action3.Type = win32service.SC_ACTION_RESTART >> action3.Delay = 600 >> >> win32service.ChangeServiceConfig2( >> hs, >> win32service.SERVICE_CONFIG_FAILURE_ACTIONS, >> [action1,action2,action3] # again, this isn't >> probably right, but... ? >> ) >> finally: >> win32service.CloseServiceHandle(hs) >> finally: >> win32service.CloseServiceHandle(hscm) >> >> Can anyone help please? >> >> Andrew >> > > > > _______________________________________________ > python-win32 mailing > listpython-win32@python.orghttp://mail.python.org/mailman/listinfo/python-win32 > >
_______________________________________________ python-win32 mailing list python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32