I omitted a pretty significant point in my first mail in that I didn't 
mention a hack/workaround to do the COM registration in HKCU as a 
non-privileged login using standard registration code by overlaying HKCR 
with HKCU\Software\Classes:

@contextmanager
def diddle_HKCR():
     try:
         hkey = RegOpenKey(HKEY_CURRENT_USER, r'''Software\Classes''')
         RegOverridePredefKey(HKEY_CLASSES_ROOT, hkey)
         yield
     finally:
         RegOverridePredefKey(HKEY_CLASSES_ROOT, None)


if __name__ == "__main__":
     from comtypes.server.register import UseCommandLine
     with diddle_HKCR():
         UseCommandLine(Action)


This technique has worked with any pythoncom stuff I've done (which 
admittedly is not all that much and all IDispatch-based)

> I would love to know how _ctypes.pyd is being called to create the 
> inproc instance

I read through the ctypes source and see that DllGetClassObject imports
comtypes.server.inprocserver which ends up here:

     try:
         _debug("DllGetClassObject(clsid=%s, iid=%s)", clsid, iid)

         cls = inproc_find_class(clsid)
         if not cls:
             return CLASS_E_CLASSNOTAVAILABLE

         result = ClassFactory(cls).IUnknown_QueryInterface(None, 
ctypes.pointer(iid), ppv)
         _debug("DllGetClassObject() -> %s", result)
         return result
     except Exception:
         _critical("DllGetClassObject", exc_info=True)
         return E_FAIL


Noting that E_FAIL is defined as
    E_FAIL = -2147467259 #0x80004005L

it looks like my code is generating an exception somewhere within

     ClassFactory(cls).IUnknown_QueryInterface(None,ctypes.pointer(iid), ppv)

I put some side effects into my module code to create a file when the 
module is loaded and I see the file being created as a 
CLSCTX_INPROC_SERVER.

The LocalServer32 registration is:

   C:\Python26\python.exe C:\work\foo\ext\mostl\action.py

However, when I try to create an instance via CLSCTX_LOCAL_SERVER then it 
just re-registers the class. On looking through the source-code, it seems 
like the option 'embedded' must be passed on the command-line but I do not 
see that string anywhere in the registry in the 
HKCU\CLID\guid\LocalServer32 value.

Apologies if I am mangling the terms horribly! I feel that I am missing 
something really obvious and that if I could figure out how to get to the 
debugging output that I could fix it up very quickly.

pjjH


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
comtypes-users mailing list
comtypes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/comtypes-users

Reply via email to