From pschay@pobox.com Mon Feb 3 18:09:04 2003 From: pschay@pobox.com (Peter Schay) Date: Mon, 3 Feb 2003 10:09:04 -0800 (PST) Subject: [python-win32] COM server Message-ID: <20030203180904.22569.qmail@web21409.mail.yahoo.com> Help! I am trying to implement a python COM server to be a custom test type for a commercial test tool. I'm not sure how to handle in/out parameters on the server side (I have no trouble on the client side). For example, the doc says that the test type object has a method with the following syntax: HRESULT GetBitmap([in] long Status, [out, retval] long * Value) Another method looks like this: HRESULT CreateScriptTemplate([in] long TestKey, [in,out] BSTR * LocalPath, [out,retval] long * Value) How can I correctly implement methods like these in a COM server? Here's what I've done so far, trying to implement GetBitmap(): Value is supposed to be an HBITMAP of the 16x16 test type bitmap. I used the dynamic policy for my server and popped up some win32ui.MessageBoxes in my object. The __init__ gets called, _dynamic_ gets called, various properties are queried, and then GetBitmap is called. However I'm not sure how to return the HBITMAP. I tried this: def GetBitmap(self, Status): f = open("c:\icon.bmp", "r") b = win32ui.CreateBitmap() b.LoadBitmapFile(f) return 1, b.GetHandle() I've tried just returning b.GetHandle() and other possibilities such as (0, b.GetHandle()). However the test tool does not use my bitmap -- of course I don't get any errors and there is no relevant log. Maybe I've done things right and the test tool always ignores the returned value of getbitmap; however I suspect the problem is on my side and most likely with my COM server since I never wrote one before. How can Python COM possibly know the expected interface of methods like GetBitmap() and CreateScriptTemplate() ? Doesn't it need to know? Can I just return tuples and expect pythoncom to magically do the right things when there are byref parameters? Thanks, Pete From mhammond@skippinet.com.au Mon Feb 3 22:58:56 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Tue, 4 Feb 2003 09:58:56 +1100 Subject: [python-win32] COM server In-Reply-To: <20030203180904.22569.qmail@web21409.mail.yahoo.com> Message-ID: <000501c2cbd7$d5790300$530f8490@eden> > Help! > I am trying to implement a python COM server to be a > custom test type for a commercial test tool. I'm not > sure how to handle in/out parameters on the server > side (I have no trouble on the client side). > > For example, the doc says that the test type object > has a method with the following syntax: > HRESULT GetBitmap([in] long Status, [out, retval] > long * Value) > Another method looks like this: > HRESULT CreateScriptTemplate([in] long TestKey, > [in,out] BSTR * LocalPath, [out,retval] long * Value) > > How can I correctly implement methods like these in a > COM server? Just like a client! > > Here's what I've done so far, trying to implement > GetBitmap(): > Value is supposed to be an HBITMAP of the 16x16 test > type bitmap. I used the dynamic policy for my server > and popped up some win32ui.MessageBoxes in my object. > The __init__ gets called, _dynamic_ gets called, > various properties are queried, and then GetBitmap is > called. However I'm not sure how to return the > HBITMAP. I tried this: > def GetBitmap(self, Status): > f = open("c:\icon.bmp", "r") > b = win32ui.CreateBitmap() > b.LoadBitmapFile(f) > return 1, b.GetHandle() Ignore the HRESULT - exceptions are used for this. As this function is a "void" from the POV of the IDL, there is only 1 return value - so you just return it! return b.GetHandle() If there are multiple out params, then you return a tuple, as you would need to do for CreateScriptTemplate: return localPath, value > I've tried just returning b.GetHandle() and other > possibilities such as (0, b.GetHandle()). However the > test tool does not use my bitmap -- of course I don't > get any errors and there is no relevant log. This certainly should work, and does for almost all VB and C++ implemented objects. Have you registered your server with "--debug", and looked for exceptions? Oh - hang on - the bitmap is being deleted. 'b' is a local variable. You return b.GetHandle(), but as soon as the function returns, 'b' goes out of scope. Its descructor then frees the bitmap making the handle invalid. Mark. From fbragason@cggenesisproject.com Tue Feb 4 04:44:10 2003 From: fbragason@cggenesisproject.com (Finn Bragason) Date: Tue, 4 Feb 2003 15:44:10 +1100 Subject: [python-win32] Passing IDispatch from a C program to Python -- Is it possible? Message-ID: <5FD5449B8D0D7849A66ED94269B45DAA83E547@mprojexch.manufact.crane.com.au> I want to create a COM object in a C/C++ program and pass it to an embedded Python program. So my C/C++ program is something like: // converter function int converter(PyObject * obj, void * p) { // Initialise obj with p -- somehow return 1; } main() ... // create a COM object IConnectPtr conn;; HRESULT hr =3D conn.CreateInstance(__uuidof(Connect)); ... do something with conn // Do the Python embedding initialise Py_Initialize(); ..etc..etc // Create a PyObject from the conn Interface to pass to Python PyObject * p =3D Py_BuildValue("O&", converter, *conn); // Set the newly created object as a parameter to python PyTuple_SetItem(pArgs, 1, p); // Call Python PyObject_CallObject(func, pArgs); My Python program would be something like: def func(conn): # Test if conn object is connected if conn.IsConnected: # do something with it Any comments greatly appreciated. Fin From mhammond@skippinet.com.au Tue Feb 4 05:49:41 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Tue, 4 Feb 2003 16:49:41 +1100 Subject: [python-win32] Passing IDispatch from a C program to Python -- Is it possible? In-Reply-To: <5FD5449B8D0D7849A66ED94269B45DAA83E547@mprojexch.manufact.crane.com.au> Message-ID: <003101c2cc11$37ae10e0$530f8490@eden> This is a multi-part message in MIME format. ------=_NextPart_000_0032_01C2CC6D.6B1E88E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit If you link to pythoncomxx.dll, you can use any of the functions in pythoncom.h specifically for this purpose. Mark. > -----Original Message----- > From: python-win32-admin@python.org > [mailto:python-win32-admin@python.org]On Behalf Of Finn Bragason > Sent: Tuesday, 4 February 2003 3:44 PM > To: python-win32@python.org > Subject: [python-win32] Passing IDispatch from a C program to > Python -- > Is it possible? > > > I want to create a COM object in a C/C++ program and pass it to an > embedded Python program. > So my C/C++ program is something like: > > // converter function > int converter(PyObject * obj, void * p) > { > // Initialise obj with p -- somehow > return 1; > } > > > main() > ... > // create a COM object > IConnectPtr conn;; > HRESULT hr = conn.CreateInstance(__uuidof(Connect)); > ... do something with conn > // Do the Python embedding initialise > Py_Initialize(); > ..etc..etc > // Create a PyObject from the conn Interface to pass to Python > PyObject * p = Py_BuildValue("O&", converter, *conn); > // Set the newly created object as a parameter to python > PyTuple_SetItem(pArgs, 1, p); > // Call Python > PyObject_CallObject(func, pArgs); > > My Python program would be something like: > def func(conn): > # Test if conn object is connected > if conn.IsConnected: > # do something with it > > Any comments greatly appreciated. > Fin > > > _______________________________________________ > Python-win32 mailing list > Python-win32@python.org > http://mail.python.org/mailman/listinfo/python-win32 > ------=_NextPart_000_0032_01C2CC6D.6B1E88E0 Content-Type: application/ms-tnef; name="winmail.dat" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="winmail.dat" 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 AEYAAAAADoUAAAAAAAADABOACCAGAAAAAADAAAAAAAAARgAAAAARhQAAAAAAAAMAFIAIIAYAAAAA AMAAAAAAAABGAAAAABiFAAAAAAAACwAVgAggBgAAAAAAwAAAAAAAAEYAAAAABoUAAAAAAAADABaA CCAGAAAAAADAAAAAAAAARgAAAAABhQAAAAAAAAIB+A8BAAAAEAAAAHHEQImDsLJPiGPuZqj3mv8C AfoPAQAAABAAAABxxECJg7CyT4hj7mao95r/AgH7DwEAAACSAAAAAAAAADihuxAF5RAaobsIACsq VsIAAG1zcHN0LmRsbAAAAAAATklUQfm/uAEAqgA32W4AAABFOlxEb2N1bWVudHMgYW5kIFNldHRp bmdzXHNraXBcTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVxNaWNyb3NvZnRcT3V0bG9v a1xvdXRsb29rLnBzdAAAAAMA/g8FAAAAAwANNP03AAACAX8AAQAAADEAAAAwMDAwMDAwMDcxQzQ0 MDg5ODNCMEIyNEY4ODYzRUU2NkE4Rjc5QUZGMjQwQkMxMDAAAAAAAwAGEGt1xDgDAAcQdwQAAAMA EBAAAAAAAwAREAEAAAAeAAgQAQAAAGUAAABJRllPVUxJTktUT1BZVEhPTkNPTVhYRExMLFlPVUNB TlVTRUFOWU9GVEhFRlVOQ1RJT05TSU5QWVRIT05DT01IU1BFQ0lGSUNBTExZRk9SVEhJU1BVUlBP U0VNQVJLLS0tLS1PAAAAAJtd ------=_NextPart_000_0032_01C2CC6D.6B1E88E0-- From fbragason@cggenesisproject.com Tue Feb 4 23:00:21 2003 From: fbragason@cggenesisproject.com (Finn Bragason) Date: Wed, 5 Feb 2003 10:00:21 +1100 Subject: [python-win32] Passing IDispatch from a C program to Python -- Is it possible? Message-ID: <5FD5449B8D0D7849A66ED94269B45DAA83E548@mprojexch.manufact.crane.com.au> Thanks for quick response Mark. Can you give me some more info on how to use the pythoncomxx.dll (an example would be great). Thanks, Fin -----Original Message----- From: Mark Hammond [mailto:mhammond@skippinet.com.au] Sent: Tuesday, 4 February 2003 4:50 PM To: Finn Bragason; python-win32@python.org Subject: RE: [python-win32] Passing IDispatch from a C program to Python -- Is it possible? If you link to pythoncomxx.dll, you can use any of the functions in pythoncom.h specifically for this purpose. Mark. > -----Original Message----- > From: python-win32-admin@python.org > [mailto:python-win32-admin@python.org]On Behalf Of Finn Bragason > Sent: Tuesday, 4 February 2003 3:44 PM > To: python-win32@python.org > Subject: [python-win32] Passing IDispatch from a C program to=20 > Python -- > Is it possible? >=20 >=20 > I want to create a COM object in a C/C++ program and pass it to an > embedded Python program. > So my C/C++ program is something like: >=20 > // converter function > int converter(PyObject * obj, void * p) > { > // Initialise obj with p -- somehow > return 1; > } >=20 >=20 > main() > ... > // create a COM object > IConnectPtr conn;; > HRESULT hr =3D conn.CreateInstance(__uuidof(Connect)); > ... do something with conn > // Do the Python embedding initialise > Py_Initialize(); > ..etc..etc > // Create a PyObject from the conn Interface to pass to Python > PyObject * p =3D Py_BuildValue("O&", converter, *conn); > // Set the newly created object as a parameter to python > PyTuple_SetItem(pArgs, 1, p); > // Call Python > PyObject_CallObject(func, pArgs); >=20 > My Python program would be something like: > def func(conn): > # Test if conn object is connected > if conn.IsConnected: > # do something with it >=20 > Any comments greatly appreciated. > Fin >=20 >=20 > _______________________________________________ > Python-win32 mailing list > Python-win32@python.org > http://mail.python.org/mailman/listinfo/python-win32 >=20 From Peteris_Martinsons@exigengroup.lv Fri Feb 7 08:17:44 2003 From: Peteris_Martinsons@exigengroup.lv (Peteris_Martinsons@exigengroup.lv) Date: Fri, 7 Feb 2003 10:17:44 +0200 Subject: [python-win32] PythonCOM produces errors in WSC script Message-ID: This is a multipart message in MIME format. --=_alternative 002D91E7C2256CC6_= Content-Type: text/plain; charset="us-ascii" Hey all! Trying to move away from VBScript to Python. Still I have a problem: PythonCOM raises "Not implemented" error if the python code is inside *.wsc script. The same code in *.pys file works fine, and the same code from interactive interpreter also without errors. If the same is written in VBscript, it works without problems. The *.wsc script is used as a COM object that takes part in a distributed transaction, involving MSDTC. Below are the debug output (DebugView from www.sysinternals.com) and the contents of the *.wsc file. Using win32all 152 on Python 2.2.1, win2000 SP2. Seems that the difference is in some COM interface that gets used in distributed transactions. -----------------------------------------------Debug output started ----------------------------------------------------- [2020] DoEvent started [2020] Next line fails [2020] pythoncom error: Python error invoking COM method. [2020] Traceback (most recent call last): [2020] File "C:\Python22\lib\site-packages\win32com\server\policy.py", line 322, in _InvokeEx_ [2020] return self._invokeex_(dispid, lcid, wFlags, args, kwargs, serviceProvider) [2020] File "C:\Python22\lib\site-packages\win32com\server\policy.py", line 652, in _invokeex_ [2020] return self._obj_._dynamic_(name, lcid, wFlags, args) [2020] File "C:\Python22\lib\site-packages\win32comext\axscript\client\scriptdispatch.py", line 46, in _dynamic_ [2020] return self.engine.ApplyInScriptedSection(None, func, tuple(realArgs)) [2020] File "C:\Python22\lib\site-packages\win32comext\axscript\client\framework.py", line 838, in ApplyInScriptedSection [2020] self.HandleException(codeBlock) [2020] File "C:\Python22\lib\site-packages\win32comext\axscript\client\framework.py", line 925, in HandleException [2020] self.scriptSite.OnScriptTerminate(None, result_exception) [2020] pywintypes.com_error: (-2147467263, 'Not implemented', None, None) --------------------------------------------Debug output end------------------------------------------------------------- -------------------------------------------WSC script start--------------------------------------------------------------- ------------------------------------wsc script end-------------------------------------------------------- -------------------- And this goes to debug output some 10-20 minutes after last erraneous wsc processing: [1396] In DllGetClassObject [1396] CShellExtClassFactory::CShellExtClassFactory() [1396] CShellExtClassFactory::QueryInterface() [1396] CShellExtClassFactory::CreateInstance() [1396] CShellExt::CShellExt() [1396] CShellExt::QueryInterface()==>IID_IShellExtInit [1396] CShellExt::AddRef() [1396] CShellExt::Initialize() [1396] CShellExt::QueryInterface()==>Unknown Interface! [1396] CShellExt::QueryInterface()==>Unknown Interface! [1396] CShellExt::QueryInterface()==>IID_IContextMenu [1396] CShellExt::AddRef() [1396] CShellExt::QueryContextMenu() [1396] CMF_EXPLORE... [1396] CShellExt::AddRef() [1396] CShellExt::Release() [1396] CShellExt::Release() [1396] CShellExt::QueryInterface()==>Unknown Interface! [1396] CShellExt::QueryInterface()==>Unknown Interface! [1396] CShellExt::Release() ---------------------------------------end of debug output------------------------------------------------- Regards, Peteris underscore Martinsons at exigengroup dot lv --=_alternative 002D91E7C2256CC6_= Content-Type: text/html; charset="us-ascii"
Hey all!

Trying to move away  from VBScript to Python. Still I have a problem: PythonCOM raises "Not implemented" error if the python code is inside *.wsc script.
The same code in *.pys file works fine, and the same code from interactive interpreter also without errors.
If the same is written in VBscript, it works without problems.

The *.wsc script is used as a COM object that takes part in a distributed transaction, involving MSDTC.
Below are the debug output (DebugView from www.sysinternals.com) and the contents of the *.wsc file.

Using win32all 152 on Python 2.2.1, win2000 SP2.

Seems that the difference is in some COM interface that gets used in distributed transactions.

-----------------------------------------------Debug output started -----------------------------------------------------
[2020] DoEvent started
[2020] Next line fails
[2020] pythoncom error: Python error invoking COM method.
[2020] Traceback (most recent call last):
[2020]   File "C:\Python22\lib\site-packages\win32com\server\policy.py", line 322, in _InvokeEx_
[2020]     return self._invokeex_(dispid, lcid, wFlags, args, kwargs, serviceProvider)
[2020]   File "C:\Python22\lib\site-packages\win32com\server\policy.py", line 652, in _invokeex_
[2020]     return self._obj_._dynamic_(name, lcid, wFlags, args)
[2020]   File "C:\Python22\lib\site-packages\win32comext\axscript\client\scriptdispatch.py", line 46, in _dynamic_
[2020]     return self.engine.ApplyInScriptedSection(None, func, tuple(realArgs))
[2020]   File "C:\Python22\lib\site-packages\win32comext\axscript\client\framework.py", line 838, in ApplyInScriptedSection
[2020]     self.HandleException(codeBlock)
[2020]   File "C:\Python22\lib\site-packages\win32comext\axscript\client\framework.py", line 925, in HandleException
[2020]     self.scriptSite.OnScriptTerminate(None, result_exception)
[2020] pywintypes.com_error: (-2147467263, 'Not implemented', None, None)
--------------------------------------------Debug output end-------------------------------------------------------------

-------------------------------------------WSC script start---------------------------------------------------------------
<?xml version="1.0"?>
<component>
<?component error="true" debug="true"?>
<registration
        description="VisiFLOW.EventHandler.Legacy.501"
        progid="VisiFLOW.EventHandler.Legacy.501"
        version="1.00"
        classid="{175A8C1F-6617-4c89-BCC7-80C2F7ACFE26}"
>
</registration>

<public>
        <method name="DoEvent" dispid="1">
                <PARAMETER name="clump"/>
        </method>
</public>

<script language="Python">
<![CDATA[
import win32com.client
import string


def DoEvent(clump):
    #-- object for printing to debug output
    dbg = win32com.client.Dispatch("Scrutil.Debug")
    dbg.Print ("DoEvent started")
   
    #-- clump is a com object that stores key-value pairs, written in C++
    #-- extract keyword parameters from it
    WflID = clump.Value("WORKFLOW_ID")
    PrjID = clump.Value("PROJECT_ID")
    NodeID = clump.Value("NODE_ID")
    ParcelID = clump.Value("PARCEL_ID")
   
   
    #-- create another container for parameters
    clumpParams = win32com.client.Dispatch("VisiFLOW.VO.Clump")
   
    #-- parse unnamed args and store them in com object
    ParamsArray = string.split(clump.Value("PARAMETER"), ",")
    clumpParams.Put("TARGET_MAILBOX", ParamsArray[1])
    clumpParams.Put("TARGET_NODE", ParamsArray[0])
    clumpParams.Put ("ADHOC_TARGET")
   
    #-- create another com object written in C++
    nameParcel = win32com.client.Dispatch("VisiFLOW.VO.Cognomen")
   
    #-- string operations
    strpcog = "//'WORKFLOW/%s/'PARCELS/%s//%s" % (WflID, NodeID, ParcelID)
   
    #-- pass the string to com method
    nameParcel.ParseDisplayName (strpcog)
   
    #-- get another com object using a method call
    wfRO = nameParcel.BindToObject("WorkflowRouter")
   
    dbg.Print ("Next line fails")
    #-- This call fails. Maybe because it receives as parameter another com object?
    #-- It has 4 arguments, only the first is not optional.
    narepl = wfRO.PreRouteParcel(nameParcel)
    dbg.Print ("Success")
]]>
</script>

</component>
------------------------------------wsc script end--------------------------------------------------------

-------------------- And this goes to debug output some 10-20 minutes after last erraneous wsc processing:

[1396] In DllGetClassObject
[1396] CShellExtClassFactory::CShellExtClassFactory()
[1396] CShellExtClassFactory::QueryInterface()
[1396] CShellExtClassFactory::CreateInstance()
[1396] CShellExt::CShellExt()
[1396] CShellExt::QueryInterface()==>IID_IShellExtInit
[1396] CShellExt::AddRef()
[1396] CShellExt::Initialize()
[1396] CShellExt::QueryInterface()==>Unknown Interface!
[1396] CShellExt::QueryInterface()==>Unknown Interface!
[1396] CShellExt::QueryInterface()==>IID_IContextMenu
[1396] CShellExt::AddRef()
[1396] CShellExt::QueryContextMenu()
[1396] CMF_EXPLORE...
[1396] CShellExt::AddRef()
[1396] CShellExt::Release()
[1396] CShellExt::Release()
[1396] CShellExt::QueryInterface()==>Unknown Interface!
[1396] CShellExt::QueryInterface()==>Unknown Interface!
[1396] CShellExt::Release()

---------------------------------------end of debug output-------------------------------------------------

Regards,
Peteris underscore Martinsons at exigengroup dot lv --=_alternative 002D91E7C2256CC6_=-- From mhutchins@amr-corp.com Fri Feb 7 16:45:32 2003 From: mhutchins@amr-corp.com (Hutchins, Mike) Date: Fri, 7 Feb 2003 09:45:32 -0700 Subject: [python-win32] Hmm The registry is a pain... Message-ID: <1DE2BB4E5055104F8B533D1264ED0BFE109D08@cor1denexc1.cor1.root01.org> I am creating a script to go out and read a list of machine names from a text file and then connect to the registry and do some trivial stuff. Change a few values and stop the computer browser service. My problem is I can't figure out what to evaluate in my if statement... I am Mr. Newb, so be kind.=20 Here is the line that connects to the machine that it is working on. My question is what will get returned if the connection fails. aReg =3D ConnectRegistry(aWS,HKEY_LOCAL_MACHINE) From mhutchins@amr-corp.com Fri Feb 7 19:10:57 2003 From: mhutchins@amr-corp.com (Hutchins, Mike) Date: Fri, 7 Feb 2003 12:10:57 -0700 Subject: [python-win32] RE: Hmm The registry is a pain... Message-ID: <1DE2BB4E5055104F8B533D1264ED0BFE109D0C@cor1denexc1.cor1.root01.org> Err, sorry to be an idiot... I figured it out. Must be the kick ass cold I have clogging my last 4 functioning brain cells.. EnvironmentError Argh.... *achoo* -----Original Message----- From: Hutchins, Mike=20 Sent: Friday, February 07, 2003 9:46 AM To: 'python-win32@python.org' Subject: Hmm The registry is a pain... I am creating a script to go out and read a list of machine names from a text file and then connect to the registry and do some trivial stuff. Change a few values and stop the computer browser service. My problem is I can't figure out what to evaluate in my if statement... I am Mr. Newb, so be kind.=20 Here is the line that connects to the machine that it is working on. My question is what will get returned if the connection fails. aReg =3D ConnectRegistry(aWS,HKEY_LOCAL_MACHINE) From przemyslawgawronski@wp.pl Fri Feb 7 22:09:45 2003 From: przemyslawgawronski@wp.pl (Przemek Gawronski) Date: Fri, 7 Feb 2003 23:09:45 +0100 Subject: [python-win32] creating user accounts Message-ID: <3e442ea90de51@wp.pl> Hi, I tryied the example in Marks Hammond & Andys Robinsons book for creating user accounts (script on page 295) on Winows 2K server, but I cann't log on on the account PythonTestUser. When I try to log on I get this message: Logon failure: the user has not been granted the requested logon type at this computer I would be thankfull for any help, what more do I need to set in the dictionary to construct a correct user (for loging in) Thanks Przemek ------------------------------------------------------------------------------ W nowym KONTAKCIE możesz WSTAWIĆ swoje ZDJĘCIE! A oprócz tego rozmawiać on-line, wysyłać smsy, e-maile, pliki. Kontakt łączy się też z ICQ i GG oraz jako jedyny CZYTA wiadomości! ściągnij za friko < http://kontakt.wp.pl > From mhammond@skippinet.com.au Sat Feb 8 23:05:15 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Sun, 9 Feb 2003 10:05:15 +1100 Subject: [python-win32] creating user accounts In-Reply-To: <3e442ea90de51@wp.pl> Message-ID: <002d01c2cfc6$8b186060$530f8490@eden> My guess is that your local policy disables this right by default. You will need to determine which attribute of the user you need to set to give this permission, and set this up in the same structure you setup the rest of the user data. Unfortunately, off the top of my head, I don't know what this permission is. Mark. > -----Original Message----- > From: python-win32-admin@python.org > [mailto:python-win32-admin@python.org]On Behalf Of Przemek Gawronski > Sent: Saturday, 8 February 2003 9:10 AM > To: python-win32@python.org > Subject: [python-win32] creating user accounts > > > Hi, I tryied the example in Marks Hammond & Andys Robinsons book > for creating user accounts (script on page 295) on Winows 2K > server, but I cann't log on on the account PythonTestUser. When I > try to log on I get this message: > > Logon failure: the user has not been granted the requested logon > type at this computer > > I would be thankfull for any help, what more do I need to set in > the dictionary to construct a correct user (for loging in) > > Thanks > > Przemek > > -------------------------------------------------------------- > ---------------- > W nowym KONTAKCIE możesz WSTAWIĆ swoje ZDJĘCIE! A oprócz tego > rozmawiać > on-line, wysyłać smsy, e-maile, pliki. Kontakt łączy się też > z ICQ i GG > oraz jako jedyny CZYTA wiadomości! ściągnij za friko < > http://kontakt.wp.pl > > > > > _______________________________________________ > Python-win32 mailing list > Python-win32@python.org > http://mail.python.org/mailman/listinfo/python-win32 > From wolf@circle-cross.org Sun Feb 9 03:35:23 2003 From: wolf@circle-cross.org (Wolf Logan) Date: Sat, 8 Feb 2003 19:35:23 -0800 Subject: [python-win32] creating user accounts References: <002d01c2cfc6$8b186060$530f8490@eden> Message-ID: <014601c2cfec$48148110$139f7943@circlecross.home> a convenient way to create new user accounts (the "recommended" way for admins) is to create a "template" user, then copy that user to create new accounts. the copy inherits all the rights and memberships of the template, so your new users are properly configured as soon as you create them. however, I don't know the proper sequence to do that copying programatically. ----- Original Message ----- From: "Mark Hammond" Sent: Saturday, February 08, 2003 3:05 PM > My guess is that your local policy disables this right by default. You will > need to determine which attribute of the user you need to set to give this > permission, and set this up in the same structure you setup the rest of the > user data. > > > -----Original Message----- > > From: python-win32-admin@python.org > > Sent: Saturday, 8 February 2003 9:10 AM > > > > Hi, I tryied the example in Marks Hammond & Andys Robinsons book > > for creating user accounts (script on page 295) on Winows 2K > > server, but I cann't log on on the account PythonTestUser. When I > > try to log on I get this message: > > > > Logon failure: the user has not been granted the requested logon > > type at this computer > > > > I would be thankfull for any help, what more do I need to set in > > the dictionary to construct a correct user (for loging in) From ilflaminio@virgilio.it Tue Feb 11 17:34:41 2003 From: ilflaminio@virgilio.it (ilflaminio@virgilio.it) Date: Tue, 11 Feb 2003 18:34:41 +0100 Subject: [python-win32] from MsWord to txt problem Message-ID: <3E3758620001E5D4@ims1c.cp.tin.it> Hi all, I have done a simple python script that reads e Ms Word Document, and loo= ping throw the paragraphs, save the text in a text file: ... f=3Dopen('c:\\ff.txt','w') for x in mydoc.Paragraphs: f.write(x.Range.Text.encode("latin1", "replace")) ... The problem is that in txt files I have the character ? instead of '. Wel= l, if I save the file as .txt with msWord menu, I have no problem, so: there= is a better correct encoding than latin1 for me? (I am italian, and I hav= e office XP on win2kpro, win32all build150 for python 2.2) Thanks for your help From jens.jorgensen@tallan.com Tue Feb 11 19:13:20 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Tue, 11 Feb 2003 13:13:20 -0600 Subject: [python-win32] from MsWord to txt problem In-Reply-To: <3E3758620001E5D4@ims1c.cp.tin.it> References: <3E3758620001E5D4@ims1c.cp.tin.it> Message-ID: <3E494B50.8050900@tallan.com> The characters Word likes to use for single quotes to not seem to be part of the latin1 charset. You should try charset utf-8 instead. Mind you that doing this you'll end up with characters which are not single byte. I tried: 'a sentence' and this turns into: '\xe2\x80\x98a sentence\xe2\x80\x99\r' ilflaminio@virgilio.it wrote: >Hi all, >I have done a simple python script that reads e Ms Word Document, and looping >throw the paragraphs, save the text in a text file: >... >f=open('c:\\ff.txt','w') >for x in mydoc.Paragraphs: > f.write(x.Range.Text.encode("latin1", "replace")) >... >The problem is that in txt files I have the character ? instead of '. Well, >if I save the file as .txt with msWord menu, I have no problem, so: there >is a better correct encoding than latin1 for me? (I am italian, and I have >office XP on win2kpro, win32all build150 for python 2.2) >Thanks for your help > > >_______________________________________________ >Python-win32 mailing list >Python-win32@python.org >http://mail.python.org/mailman/listinfo/python-win32 > > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From jens.jorgensen@tallan.com Tue Feb 11 20:09:58 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Tue, 11 Feb 2003 14:09:58 -0600 Subject: [python-win32] from MsWord to txt problem In-Reply-To: <3E494B50.8050900@tallan.com> References: <3E3758620001E5D4@ims1c.cp.tin.it> <3E494B50.8050900@tallan.com> Message-ID: <3E495896.7090306@tallan.com> This is a cryptographically signed message in MIME format. --------------ms020607030107050506070503 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit To follow up on my own post the chars Word uses are U+2018 (LEFT SINGLE QUOTATION MARK, see http://www.eki.ee/letter/chardata.cgi?ucode=2018) and U+2019 (RIGHT SINGLE QUOTATION MARK, see http://www.eki.ee/letter/chardata.cgi?ucode=2019). Apparenty in unicode U+0027 or the regular ascii char 0x27 is called APOSTROPHE which one can see having different symantic meaning. The left-to-right pointing ` character ascii 0x60 is called GRAVE ACCENT. Before you start thinking Word really is clever I'll point out that the paragraph that is frank's shovel encodes to UTF-8 as: 'that is frank\xe2\x80\x99s shovel\r' so it uses the RIGHT SINGLE QUOTATION MARK here where it should actually be using the apostrophe. More than you wanted to know? Jens B. Jorgensen wrote: > The characters Word likes to use for single quotes to not seem to be > part of the latin1 charset. You should try charset utf-8 instead. Mind > you that doing this you'll end up with characters which are not single > byte. I tried: > > 'a sentence' > > and this turns into: > > '\xe2\x80\x98a sentence\xe2\x80\x99\r' > > ilflaminio@virgilio.it wrote: > >> Hi all, >> I have done a simple python script that reads e Ms Word Document, and >> looping >> throw the paragraphs, save the text in a text file: >> ... >> f=open('c:\\ff.txt','w') >> for x in mydoc.Paragraphs: >> f.write(x.Range.Text.encode("latin1", "replace")) ... >> The problem is that in txt files I have the character ? instead of '. >> Well, >> if I save the file as .txt with msWord menu, I have no problem, so: >> there >> is a better correct encoding than latin1 for me? (I am italian, and I >> have >> office XP on win2kpro, win32all build150 for python 2.2) >> Thanks for your help >> >> >> _______________________________________________ >> Python-win32 mailing list >> Python-win32@python.org >> http://mail.python.org/mailman/listinfo/python-win32 >> >> > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" --------------ms020607030107050506070503 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIIkjCC AqcwggIQoAMCAQICAwf4vDANBgkqhkiG9w0BAQQFADCBkjELMAkGA1UEBhMCWkExFTATBgNV BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMQ8wDQYDVQQKEwZUaGF3dGUx HTAbBgNVBAsTFENlcnRpZmljYXRlIFNlcnZpY2VzMSgwJgYDVQQDEx9QZXJzb25hbCBGcmVl bWFpbCBSU0EgMjAwMC44LjMwMB4XDTAyMDcyNTIyMTMwMFoXDTAzMDcyNTIyMTMwMFowZjES MBAGA1UEBBMJSm9yZ2Vuc2VuMQ0wCwYDVQQqEwRKZW5zMRcwFQYDVQQDEw5KZW5zIEpvcmdl bnNlbjEoMCYGCSqGSIb3DQEJARYZamVucy5qb3JnZW5zZW5AdGFsbGFuLmNvbTCBnzANBgkq hkiG9w0BAQEFAAOBjQAwgYkCgYEAh7kk1prczfhWLforRQ6nY0s3p8XS491ey73zs0LzqzZD cS4CcXY6kX8yajKKVJ+rip+y/AVidFawUn4gCclZ7Ewd1liGmawe8PszXI38MXHZAKv38NBJ zskUNrNXSR6BN9+XzkEwDinM4EW9Keq0LFnbHp70f2HxC6VFIlz+f0sCAwEAAaM2MDQwJAYD VR0RBB0wG4EZamVucy5qb3JnZW5zZW5AdGFsbGFuLmNvbTAMBgNVHRMBAf8EAjAAMA0GCSqG SIb3DQEBBAUAA4GBAMjwbcXiAGXuX8Zqx6dI7dRJ8yK60vE273vfzX1ib6BwW2Tav1yr+Ju5 ywrf37Jmxpqhr/dKyCL8XV0o8b3yv3I2fCfLFTvSthGgPbQ8PscvA4OIRmBVj3W3ru6sD0ji ZxmJmP66wGUFIWHbeoDHWeR0KlNrrhYV4jWvTXzIkQvZMIICpzCCAhCgAwIBAgIDB/i8MA0G CSqGSIb3DQEBBAUAMIGSMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw EAYDVQQHEwlDYXBlIFRvd24xDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUQ2VydGlmaWNh dGUgU2VydmljZXMxKDAmBgNVBAMTH1BlcnNvbmFsIEZyZWVtYWlsIFJTQSAyMDAwLjguMzAw HhcNMDIwNzI1MjIxMzAwWhcNMDMwNzI1MjIxMzAwWjBmMRIwEAYDVQQEEwlKb3JnZW5zZW4x DTALBgNVBCoTBEplbnMxFzAVBgNVBAMTDkplbnMgSm9yZ2Vuc2VuMSgwJgYJKoZIhvcNAQkB FhlqZW5zLmpvcmdlbnNlbkB0YWxsYW4uY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB gQCHuSTWmtzN+FYt+itFDqdjSzenxdLj3V7LvfOzQvOrNkNxLgJxdjqRfzJqMopUn6uKn7L8 BWJ0VrBSfiAJyVnsTB3WWIaZrB7w+zNcjfwxcdkAq/fw0EnOyRQ2s1dJHoE335fOQTAOKczg Rb0p6rQsWdsenvR/YfELpUUiXP5/SwIDAQABozYwNDAkBgNVHREEHTAbgRlqZW5zLmpvcmdl bnNlbkB0YWxsYW4uY29tMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEEBQADgYEAyPBtxeIA Ze5fxmrHp0jt1EnzIrrS8Tbve9/NfWJvoHBbZNq/XKv4m7nLCt/fsmbGmqGv90rIIvxdXSjx vfK/cjZ8J8sVO9K2EaA9tDw+xy8Dg4hGYFWPdbeu7qwPSOJnGYmY/rrAZQUhYdt6gMdZ5HQq U2uuFhXiNa9NfMiRC9kwggM4MIICoaADAgECAhBmRXK3zHT1z2N2RYTQLpEBMA0GCSqGSIb3 DQEBBAUAMIHRMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQH EwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0 aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSQwIgYDVQQDExtUaGF3dGUgUGVyc29uYWwg RnJlZW1haWwgQ0ExKzApBgkqhkiG9w0BCQEWHHBlcnNvbmFsLWZyZWVtYWlsQHRoYXd0ZS5j b20wHhcNMDAwODMwMDAwMDAwWhcNMDQwODI3MjM1OTU5WjCBkjELMAkGA1UEBhMCWkExFTAT BgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMQ8wDQYDVQQKEwZUaGF3 dGUxHTAbBgNVBAsTFENlcnRpZmljYXRlIFNlcnZpY2VzMSgwJgYDVQQDEx9QZXJzb25hbCBG cmVlbWFpbCBSU0EgMjAwMC44LjMwMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDeMzKm Y8cJJUU+0m54J2eBxdqIGYKXDuNEKYpjNSptcDz63K737nRvMLwzkH/5NHGgo22Y8cNPomXb DfpL8dbdYaX5hc1VmjUanZJ1qCeu2HL5ugL217CR3hzpq+AYA6h8Q0JQUYeDPPA5tJtUihOH /7ObnUlmAC0JieyUa+mhaQIDAQABo04wTDApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRUHJp dmF0ZUxhYmVsMS0yOTcwEgYDVR0TAQH/BAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJKoZI hvcNAQEEBQADgYEAMbFLR135AXHl9VNsXXnWPZjAJhNigSKnEvgilegbSbcnewQ5uvzm8iTr kfq97A0qOPdQVahs9w2tTBu8A/S166JHn2yiDFiNMUIJEWywGmnRKxKyQF1q+XnQ6i4l3Yrk /NsNH50C81rbyjz2ROomaYd/SJ7OpZ/nhNjJYmKtBcYxggNUMIIDUAIBATCBmjCBkjELMAkG A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMQ8w DQYDVQQKEwZUaGF3dGUxHTAbBgNVBAsTFENlcnRpZmljYXRlIFNlcnZpY2VzMSgwJgYDVQQD Ex9QZXJzb25hbCBGcmVlbWFpbCBSU0EgMjAwMC44LjMwAgMH+LwwCQYFKw4DAhoFAKCCAg8w GAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDMwMjExMjAwOTU4 WjAjBgkqhkiG9w0BCQQxFgQU68Fq6H3Wo5t8vyGTDG07lEq+SmAwUgYJKoZIhvcNAQkPMUUw QzAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcw DQYIKoZIhvcNAwICASgwgasGCSsGAQQBgjcQBDGBnTCBmjCBkjELMAkGA1UEBhMCWkExFTAT BgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMQ8wDQYDVQQKEwZUaGF3 dGUxHTAbBgNVBAsTFENlcnRpZmljYXRlIFNlcnZpY2VzMSgwJgYDVQQDEx9QZXJzb25hbCBG cmVlbWFpbCBSU0EgMjAwMC44LjMwAgMH+Lwwga0GCyqGSIb3DQEJEAILMYGdoIGaMIGSMQsw CQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24x DzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUQ2VydGlmaWNhdGUgU2VydmljZXMxKDAmBgNV BAMTH1BlcnNvbmFsIEZyZWVtYWlsIFJTQSAyMDAwLjguMzACAwf4vDANBgkqhkiG9w0BAQEF AASBgHNdy13qk7MZuiXCOutYf7y68uFPaG5MCsYNkLjAXiCmsd2gGtQTfeMNuAEYkGdvU55T Uric4rjNuD5ePftS/hUabDKe1XkFAYxrsaIhrE61P4as+bWirrBW4pnIhHIGROqrSPsWYOdq FQylX7zcj5DkAjBQLNK/C0IBdMZmlGeWAAAAAAAA --------------ms020607030107050506070503-- From bodoni26@resnet.gatech.edu Tue Feb 11 22:21:31 2003 From: bodoni26@resnet.gatech.edu (Steven Scott) Date: Tue, 11 Feb 2003 17:21:31 -0500 Subject: [python-win32] QueryInterface woes Message-ID: <1045002091.3e49776bc868f@www.progoth.com> I'm connecting to Domino through it's COM interface with PythonCOM, and I= 've been able to do everything I need to until now. I have a method which returns an object of type IItem. Well, the Domino = COM interface has this method. IItem has a "subclass" (I'm not up on all the fancy COM terminology) called IRichTextItem. I need to take the result o= f this method, which is an IItem, and call methods on it which only exist i= n IRichTextItem (yes, it is really an IRichTextItem). anyway, the COM peop= le around here say that I need to use QueryInterface to get the richtext interface as opposed to just the regular item. How do I go about this? So far I've tried messing around with my object, and calling body._oleobj_.QueryInterface() with different stuff. Pretty much anything I put in resulted with some error about it not being able to find that IID, or something. I went int= o the gen_py directory and got the Domino file, and tried QI() with the IRichTextItem CLSID (in the form '{29131574-2EED-1069-BF5D-00DD011186B7}'= ) and in this case I get the error "There is no interface object registered that supports this IID". anyway I'm really at a loss, any help would be appreciated. --=20 Steven Scott [Bodoni26@resnet.gatech.edu] Don't give up fighting, 'til nothing else stands in your way..Don't give up talking, until there's nothing left to say....But no matter From jens.jorgensen@tallan.com Tue Feb 11 22:59:15 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Tue, 11 Feb 2003 16:59:15 -0600 Subject: [python-win32] QueryInterface woes In-Reply-To: <1045002091.3e49776bc868f@www.progoth.com> References: <1045002091.3e49776bc868f@www.progoth.com> Message-ID: <3E498043.6090303@tallan.com> In order to access interfaces other than default what you need to do is first generate wrapper classes from the type library. This is easily done through the makepy.py script included with win32all. Let's say your wrapper module is called "Domino" and the object you have is called an_item. All you need to do is: rti = Domino.IRichTextItem(an_item) rti.SomeMethodYouCouldNotCallBefore() The makepy.py will make a wrapper class for each interface defined in the typelib you point it to. When you pass the object to the constructor for this iterface-wrapping-class it will automatically do the QueryInterface call for you and give you back the wrapped class you want and deserve. Steven Scott wrote: >I'm connecting to Domino through it's COM interface with PythonCOM, and I've >been able to do everything I need to until now. >I have a method which returns an object of type IItem. Well, the Domino COM >interface has this method. IItem has a "subclass" (I'm not up on all the >fancy COM terminology) called IRichTextItem. I need to take the result of >this method, which is an IItem, and call methods on it which only exist in >IRichTextItem (yes, it is really an IRichTextItem). anyway, the COM people >around here say that I need to use QueryInterface to get the richtext >interface as opposed to just the regular item. > >How do I go about this? > >So far I've tried messing around with my object, and calling > > body._oleobj_.QueryInterface() > >with different stuff. Pretty much anything I put in resulted with some >error about it not being able to find that IID, or something. I went into >the gen_py directory and got the Domino file, and tried QI() with the >IRichTextItem CLSID (in the form '{29131574-2EED-1069-BF5D-00DD011186B7}') >and in this case I get the error "There is no interface object registered >that supports this IID". > >anyway I'm really at a loss, any help would be appreciated. > > > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From bodoni26@resnet.gatech.edu Tue Feb 11 23:28:29 2003 From: bodoni26@resnet.gatech.edu (Steven Scott) Date: Tue, 11 Feb 2003 18:28:29 -0500 Subject: [python-win32] QueryInterface woes In-Reply-To: <3E498043.6090303@tallan.com> References: <1045002091.3e49776bc868f@www.progoth.com> <3E498043.6090303@tallan.com> Message-ID: <200302111828.29214.bodoni26@resnet.gatech.edu> On Tuesday 11 February 2003 5:59 pm, you wrote: > wrapper module is called "Domino" and the object you have is called > an_item. All you need to do is: > > rti = Domino.IRichTextItem(an_item) > rti.SomeMethodYouCouldNotCallBefore() > ok thanks that's a huge help is this seperate from the first time I ran makepy, for early binding? basically, I don't know what to import. the IRichTextItem wrapper class is defined in the file made by makepy in the gen_py directory, but I don't know how to import that.....I feel like I've done that before, but it's been over a year. basically the only way I know how to access the COM stuff is by calling Dispatch('Lotus.NotesSession') and calling methods on the returned object. thanks again -- Steven Scott [Bodoni26@resnet.gatech.edu] Don't give up fighting, 'til nothing else stands in your way..Don't give up talking, until there's nothing left to say....But no matter what you do, don't ever compromise what you believe. --The Ataris From jens.jorgensen@tallan.com Wed Feb 12 00:12:40 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Tue, 11 Feb 2003 18:12:40 -0600 Subject: [python-win32] QueryInterface woes In-Reply-To: <200302111828.29214.bodoni26@resnet.gatech.edu> References: <1045002091.3e49776bc868f@www.progoth.com> <3E498043.6090303@tallan.com> <200302111828.29214.bodoni26@resnet.gatech.edu> Message-ID: <3E499178.7080401@tallan.com> Steven Scott wrote: >On Tuesday 11 February 2003 5:59 pm, you wrote: > > >>wrapper module is called "Domino" and the object you have is called >>an_item. All you need to do is: >> >>rti = Domino.IRichTextItem(an_item) >>rti.SomeMethodYouCouldNotCallBefore() >> >> >> > >ok thanks that's a huge help > >is this seperate from the first time I ran makepy, for early binding? >basically, I don't know what to import. the IRichTextItem wrapper class is >defined in the file made by makepy in the gen_py directory, but I don't know >how to import that.....I feel like I've done that before, but it's been over >a year. > when you run makepy.py (without the '-o' parameter) the wrapper module is created in the Lib/site-packages/win32com/gen_py dir as you surmise. A nice way to get this module explicitly in your script is by something like: from win32com.client import gencache Domino = gencache.EnsureModule('{783CD4E0-9D54-11CF-B8EE-00608CC9A71F}', 0, 5, 1) replacing of course the above guid with the typelib, version ,lang, etc. with the ones for Domino. >basically the only way I know how to access the COM stuff is by calling >Dispatch('Lotus.NotesSession') and calling methods on the returned object. > Yeah, and this works fine when you hitting the "default interface" which is implemented through IDispatch but once you have classes that support multiple interfaces you start needed to generate the wrappers and use the classes therein explicitly. It could be there's a generic way to get at the wrapper classes without explicitly getting the module as I have above. There is a way to get at constants like this but I always just go after the module explicitly. I think it makes my code clearer anyhow. -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From mhammond@skippinet.com.au Wed Feb 12 21:35:15 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Thu, 13 Feb 2003 08:35:15 +1100 Subject: [python-win32] QueryInterface woes In-Reply-To: <1045002091.3e49776bc868f@www.progoth.com> Message-ID: <012f01c2d2de$a2546dd0$530f8490@eden> If you grab the latest win32all, you will find a "CastTo" method. This can be used like: richitem = win32com.client.CastTo(item, "IRichTextItem") This will perform the name lookup, and do the QI for you, and should give the same result as Jen's advice. Mark. > -----Original Message----- > From: python-win32-admin@python.org > [mailto:python-win32-admin@python.org]On Behalf Of Steven Scott > Sent: Wednesday, 12 February 2003 9:22 AM > To: python-win32@python.org > Subject: [python-win32] QueryInterface woes > > > I'm connecting to Domino through it's COM interface with > PythonCOM, and I've > been able to do everything I need to until now. > I have a method which returns an object of type IItem. Well, > the Domino COM > interface has this method. IItem has a "subclass" (I'm not > up on all the > fancy COM terminology) called IRichTextItem. I need to take > the result of > this method, which is an IItem, and call methods on it which > only exist in > IRichTextItem (yes, it is really an IRichTextItem). anyway, > the COM people > around here say that I need to use QueryInterface to get the richtext > interface as opposed to just the regular item. > > How do I go about this? > > So far I've tried messing around with my object, and calling > > body._oleobj_.QueryInterface() > > with different stuff. Pretty much anything I put in resulted > with some > error about it not being able to find that IID, or something. > I went into > the gen_py directory and got the Domino file, and tried QI() with the > IRichTextItem CLSID (in the form > '{29131574-2EED-1069-BF5D-00DD011186B7}') > and in this case I get the error "There is no interface > object registered > that supports this IID". > > anyway I'm really at a loss, any help would be appreciated. > > -- > Steven Scott [Bodoni26@resnet.gatech.edu] > Don't give up fighting, 'til nothing else stands in your way..Don't > give up talking, until there's nothing left to say....But no matter > > _______________________________________________ > Python-win32 mailing list > Python-win32@python.org > http://mail.python.org/mailman/listinfo/python-win32 From pschay@pobox.com Fri Feb 14 09:00:44 2003 From: pschay@pobox.com (Peter Schay) Date: Fri, 14 Feb 2003 01:00:44 -0800 (PST) Subject: [python-win32] embedding an excel object Message-ID: <20030214090044.84178.qmail@web21412.mail.yahoo.com> Hello, I'm having a blast with Python and Pythonwin; they are both really impressive. Normally I like to figure things out myself but there's just too much I don't know at this point. I hope somebody can offer suggestions for how I can do the following: I'd like to get a python instance of an Excel Active-X object and customize it a little and serve it up as a Python COM service. (At least I think that's what I need to do). Can I do this? How? The test product I'm extending with Python COM has a few interfaces that I can write COM servers for. One of these is a script viewer. The script viewer is supposed to be an Active-X control. I assume that implies a whole bunch of required methods and properties, which I'm assuming are part of some Excel object out there? In Microsoft's OLE/COM viewer under the "embeddable objects" category I can see a few called "Microsoft Excel Chart". I am hoping I can use one of these. I suppose I have to add the extra interfaces required by the test product I'm extending -- actually there seem to be just 2: an Init function, and a ShowTest function. The VB example given for ShowTest just populates a listbox. The custom listbox shows up nicely within the browser window of the test management tool. So I'm using Python rather than VB, and I'd like to embed an Excel sheet in there instead of a listbox. Is this feasible? Thanks!! Pete From Dan.Kruger@vancoservices.com Fri Feb 14 20:12:35 2003 From: Dan.Kruger@vancoservices.com (Dan Kruger) Date: Fri, 14 Feb 2003 14:12:35 -0600 Subject: [python-win32] makepy problem with a .Net assembly => COM Message-ID: Hello! I'm new to .Net, and Python, so please forgive me in advance if I sound = rather inexperienced.. I've been building a set of tools for the programming staff where I work = to provide simple access to some of the more complexities behind accessing a MySQL server with a dedicated data = provider as well as some of the business rules.. Internal processing programs will be using the .Net assemblies I've = produced, but our web content is mostly created with Python (thru CGI scripting) because it's a far easier for the web-designers= to comprehend. Currently, there has been functions written to emulate the functionality = of the .Net assemblies, which could potentially create a maintenance = headache if business policies were to change.. (i.e. the python functions = would have to be updated along side the .Net functions) So.. what I'd like to do is use the .Net assemblies in the Python scripts = so that all data processing is going through the same engine. Anyway.. here are the steps I've gone through to make this happen, and = here's the problem I'm experiencing: I ... 1) compiled the assembly=20 2) placed it in the same directory as the python interpretter 3) regasm /tlb'ed the assembly. >>> import win32com.client Rebuilding cache of generated files for COM support... Done. >>> a =3D win32com.client.Dispatch("DotNetSystemTools.ByteFXDataAccess.clsM= ySQLQueryExecute") >>> print a.Execute("SELECT NOW()",0) Traceback (most recent call last): File "", line 1, in ? File "= ", line 2, in Execute com_error: (-2147352567, 'Exception occurred.', (0, 'DotNetSystemTools', = 'Object reference not set to an instance of an object.', None, 0, = -2147467261), None) So.. I run the makepy utility.. I get... >>> Generating to C:\Python22\lib\site-packages\win32com\gen_py\F9CBB761-13= 89-4044-87AC-F68E4286CD02x0x1x0.py Now when I try to reference the COM object I get... >>> a =3D win32com.client.Dispatch("DotNetSystemTools.ByteFXDataAccess.clsM= ySQLQueryExecute") >>> print a.Execute("SELECT NOW()",0) Traceback (most recent call last): File "", line 1, in ? File "C:\Python22\lib\site-packages\win32com\client\__init__.py", line = 368, in __getattr__ raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self)= , attr) AttributeError: '' object has no = attribute 'Execute' I got no warnings when I built the tlb files with regasm. Any idea why = this won't go from the meager amount of information I've given here. (I = would probably be able to supply the source) The assembly does have some 3rd party reference .dlls (I believe the = author wrote these in C# managed code). Would this make a difference? = I'm guessing it wouldn't since there are NO direct interfaces to these 3rd = party interfaces are public (just function/property wrappers I've written = that hand the data off). From Dan.Kruger@vancoservices.com Fri Feb 14 21:41:39 2003 From: Dan.Kruger@vancoservices.com (Dan Kruger) Date: Fri, 14 Feb 2003 15:41:39 -0600 Subject: [python-win32] makepy problem with a .Net assembly => COM Message-ID: Dan Kruger wrote: -------------------------- Hello! I'm new to .Net, and Python, so please forgive me in advance if I sound = rather inexperienced.. I've been building a set of tools for the programming staff where I work = to provide simple access to some of the more complexities behind accessing a MySQL server with a dedicated data = provider as well as some of the business rules.. Internal processing programs will be using the .Net assemblies I've = produced, but our web content is mostly created with Python (thru CGI scripting) because it's a far easier for the web-designers= to comprehend. Currently, there has been functions written to emulate the functionality = of the .Net assemblies, which could potentially create a maintenance = headache if business policies were to change.. (i.e. the python functions = would have to be updated along side the .Net functions) So.. what I'd like to do is use the .Net assemblies in the Python scripts = so that all data processing is going through the same engine. Anyway.. here are the steps I've gone through to make this happen, and = here's the problem I'm experiencing: I ... 1) compiled the assembly=20 2) placed it in the same directory as the python interpretter 3) regasm /tlb'ed the assembly. >>> import win32com.client Rebuilding cache of generated files for COM support... Done. >>> a =3D win32com.client.Dispatch("DotNetSystemTools.ByteFXDataAccess.clsM= ySQLQueryExecute") >>> print a.Execute("SELECT NOW()",0) Traceback (most recent call last): File "", line 1, in ? File "= ", line 2, in Execute com_error: (-2147352567, 'Exception occurred.', (0, 'DotNetSystemTools', = 'Object reference not set to an instance of an object.', None, 0, = -2147467261), None) So.. I run the makepy utility.. I get... >>> Generating to C:\Python22\lib\site-packages\win32com\gen_py\F9CBB761-13= 89-4044-87AC-F68E4286CD02x0x1x0.py Now when I try to reference the COM object I get... >>> a =3D win32com.client.Dispatch("DotNetSystemTools.ByteFXDataAccess.clsM= ySQLQueryExecute") >>> print a.Execute("SELECT NOW()",0) Traceback (most recent call last): File "", line 1, in ? File "C:\Python22\lib\site-packages\win32com\client\__init__.py", line = 368, in __getattr__ raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self)= , attr) AttributeError: '' object has no = attribute 'Execute' I got no warnings when I built the tlb files with regasm. Any idea why = this won't go from the meager amount of information I've given here. (I = would probably be able to supply the source) The assembly does have some 3rd party reference .dlls (I believe the = author wrote these in C# managed code). Would this make a difference? = I'm guessing it wouldn't since there are NO direct interfaces to these 3rd = party interfaces are public (just function/property wrappers I've written = that hand the data off). =AF------------------- Ok.. I managed (no pun intended) to get the object to create with the = first method.. (word to the wise, when you declare a string in vb.net, = instead of setting it to "", it sets it to Nothing. Be prepared to handle = an error when a string is Nothing if you don't initialize it to "" ;) ) Here's the weird thing. Under that "Execute" function, an .ExecuteScalar = is being called, and SHOULD return a value. I'm always getting "None" returned to python. (Execute function returns = an "Object" datatype, which should convert to the appropriate type when = returned) Any ideas? Thanks in advance Dan From d.l.dwiggins@computer.org Fri Feb 14 23:50:01 2003 From: d.l.dwiggins@computer.org (Don Dwiggins) Date: Fri, 14 Feb 2003 23:50:01 +0000 (UTC) Subject: [python-win32] Re: embedding an excel object References: <20030214090044.84178.qmail@web21412.mail.yahoo.com> Message-ID: Peter Schay writes: > I'm having a blast with Python and Pythonwin; they are > both really impressive. Normally I like to figure > things out myself but there's just too much I don't > know at this point. I hope somebody can offer > suggestions for how I can do the following: Sounds like you're well into exploring the possibilities. If you haven't already, I strongly recommend that you get Hammond & Robinson's book "Python programming for Win32" (an O'Reilly book); much of what you're asking is there, or can be figured out from there. I'd also recommend you visit Microsoft's MSDN pages, where you can find more than you ever wanted to know about automating Excel (try Googling for [msdn "excel object model"] to get quick access to the right place). Warning: Excel has one of the hairiest models I've run across -- don't try to figure it all out, but start with what you want to accomplish and drill into what looks like the right area ASAP. Plan to do a lot of experimenting in Pythonwin. Happy hunting, -- Don Dwiggins "Experience is what you get when d.l.dwiggins@computer.org you were expecting something else." -- Seen on an office wall From mhammond@skippinet.com.au Sat Feb 15 00:53:45 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Sat, 15 Feb 2003 11:53:45 +1100 Subject: [python-win32] makepy problem with a .Net assembly => COM In-Reply-To: Message-ID: <00bd01c2d48c$b1c2f890$530f8490@eden> I suggest you package up a small example that demonstrates the problem. Note that even though the function is declared as returning an Object, A NULL reference could still be returned - ie, a functio that returns an "Object" may also return None. In general, you should find the COM interop stuff works OK. The Python for .NET compiler I played with uses win32com to talk to the Reflection::Emit APIs. While there are some problems, they are fairly esoteric, so non-compilers shouldn't have them. Mark. > -----Original Message----- > From: python-win32-admin@python.org > [mailto:python-win32-admin@python.org]On Behalf Of Dan Kruger > Sent: Saturday, 15 February 2003 7:13 AM > To: python-win32@python.org > Subject: [python-win32] makepy problem with a .Net assembly => COM > > > Hello! > > I'm new to .Net, and Python, so please forgive me in advance > if I sound rather inexperienced.. > > I've been building a set of tools for the programming staff > where I work to provide simple access to some of the > more complexities behind accessing a MySQL server with a > dedicated data provider as well as some of the business rules.. > > Internal processing programs will be using the .Net > assemblies I've produced, but our web content is mostly created with > Python (thru CGI scripting) because it's a far easier for the > web-designers to comprehend. > > Currently, there has been functions written to emulate the > functionality of the .Net assemblies, which could potentially > create a maintenance headache if business policies were to > change.. (i.e. the python functions would have to be updated > along side the .Net functions) > > So.. what I'd like to do is use the .Net assemblies in the > Python scripts so that all data processing is going through > the same engine. > > Anyway.. here are the steps I've gone through to make this > happen, and here's the problem I'm experiencing: > I ... > 1) compiled the assembly > 2) placed it in the same directory as the python interpretter > 3) regasm /tlb'ed the assembly. > > >>> import win32com.client > Rebuilding cache of generated files for COM support... > Done. > >>> a = > win32com.client.Dispatch("DotNetSystemTools.ByteFXDataAccess.c > lsMySQLQueryExecute") > >>> print a.Execute("SELECT NOW()",0) > Traceback (most recent call last): > File "", line 1, in ? > File " DotNetSystemTools.ByteFXDataAccess.clsMySQLQueryExecute>", > line 2, in Execute > com_error: (-2147352567, 'Exception occurred.', (0, > 'DotNetSystemTools', 'Object reference not set to an instance > of an object.', None, 0, -2147467261), None) > > > So.. I run the makepy utility.. I get... > > >>> Generating to > C:\Python22\lib\site-packages\win32com\gen_py\F9CBB761-1389-40 > 44-87AC-F68E4286CD02x0x1x0.py > > Now when I try to reference the COM object I get... > > >>> a = > win32com.client.Dispatch("DotNetSystemTools.ByteFXDataAccess.c > lsMySQLQueryExecute") > >>> print a.Execute("SELECT NOW()",0) > Traceback (most recent call last): > File "", line 1, in ? > File > "C:\Python22\lib\site-packages\win32com\client\__init__.py", > line 368, in __getattr__ > raise AttributeError, "'%s' object has no attribute '%s'" > % (repr(self), attr) > AttributeError: > '' object has no attribute 'Execute' > > I got no warnings when I built the tlb files with regasm. > Any idea why this won't go from the meager amount of > information I've given here. (I would probably be able to > supply the source) > > The assembly does have some 3rd party reference .dlls (I > believe the author wrote these in C# managed code). Would > this make a difference? I'm guessing it wouldn't since there > are NO direct interfaces to these 3rd party interfaces are > public (just function/property wrappers I've written that > hand the data off). > > > _______________________________________________ > Python-win32 mailing list > Python-win32@python.org > http://mail.python.org/mailman/listinfo/python-win32 > From nielssteenkrogh@hotmail.com Sat Feb 15 14:40:46 2003 From: nielssteenkrogh@hotmail.com (Niels Steen Krogh) Date: Sat, 15 Feb 2003 15:40:46 +0100 Subject: [python-win32] creating excel via zope, external method and win32com - Colninitialize error Message-ID: Hi! I´ve done a converter from mysql via zope/external method to excel spreadsheet using the win32com method. Maybee this is a zope error - but I guess it's also very much a win32com issue - so I try this list. I have a zope 2.6.1., python 2.1.3, win32com on a office xp prof os. Most of the time everything fuctions o.k. - but often I get an Colninitialize error, which I can't get rid of without restarting my zope instance or even rebooting my desktop. I get the folowing traceback: Traceback (innermost last): Module ZPublisher.Publish, line 98, in publish Module ZPublisher.mapply, line 88, in mapply Module ZPublisher.Publish, line 39, in call_object Module Shared.DC.Scripts.Bindings, line 252, in __call__ Module Shared.DC.Scripts.Bindings, line 283, in _bindAndExec Module Products.PythonScripts.PythonScript, line 315, in _exec Module Script (Python), line 14, in SkabRegneark - - Line 14 Module Products.ExternalMethod.ExternalMethod, line 224, in __call__ - __traceback_info__: (((('Fornavn', 'Efternavn', 'Stilling', 'Arbejdsomraader', 'Tlfnummer', 'Mobilnummer', 'Email', 'Billedelink'), ('Ole', 'Petersen', 'IT-chef', 'Ledelse, Overordnet IT-planl\xc3\xa6gning', '33889900', '23457890', 'olp@DOMSTOLS.DK', 'PEWIMG.JPG'), ('Niels', 'Krogh', 'IT-Udviklingschef', 'Ledelse, IT-arkitektur, IT-udviklingsprojekter, webomr\xc3\xa5det', '33929518', '24568975', 'NSK@DOMSTOLS.DK', 'NSKIMG.JPG')),), {}, None) Module C:\Programmer\zope61\Extensions\SkrivExcelFraMysql.py, line 4, in SkrivExcelFraMysql Module win32com.client, line 92, in Dispatch Module win32com.client.dynamic, line 81, in _GetGoodDispatchAndUserName Module win32com.client.dynamic, line 72, in _GetGoodDispatch com_error: (-2147221008, 'Colnitialize has not been called.', None, None) My pythonscript (in zope) hent=context.VisAlleTolkedata() #hent=context.VisAllePersonaleData() data=hent.dictionaries() kolonnenavne=hent.names() x=[] x.append(tuple(kolonnenavne)) for record in data: y=[] for kolonnenavn in kolonnenavne: y.append(record[kolonnenavn]) y=tuple(y) x.append(y) data=tuple(x) context.SkrivExcelFraMysql(data) #calling the external method My external python script (SkrivExcelFraMysql.py) def SkrivExcelFraMysql(data): import string from win32com.client import Dispatch o=Dispatch("Excel.Application") #this is line 4 o.Visible=0 o.Workbooks.Open(Filename='c:\\dokumenter\\mappe14.xls') o.Workbooks(1).Sheets(1).Cells.Clear() sht=o.Workbooks(1).Sheets(1) sht.Range(sht.Cells(1,1),sht.Cells(len(data),len(data[0]))).Value=data o.Workbooks(1).Save() o.Workbooks(1).Close(SaveChanges='0') o.Quit() del o del sht del data /Niels Steen Krogh _________________________________________________________________ Hold kontakten med dine venner med MSN Messenger http://messenger.msn.dk From pschay@pobox.com Sun Feb 16 01:19:10 2003 From: pschay@pobox.com (Peter Schay) Date: Sat, 15 Feb 2003 17:19:10 -0800 (PST) Subject: [python-win32] Re: embedding an excel object In-Reply-To: Message-ID: <20030216011910.46893.qmail@web21414.mail.yahoo.com> Thanks for the encouragement! Yes, I have the O'Reilly book and I'm doing what I can to figure this out myself. I will follow up on the google pointer you suggested. Still, the main reason I sent a query to this list was that I suspected the answer might be an easy one for somebody. I fear that it's definitely going to take me some time on my own, and I would love to get this working sooner rather than later. I tried to call win32com.client.GetObject() with the clsid of the Excel thing I found with the OLE/COM browser, but I got an error. Is that the right way to start? Does GetObject() create an instance of a registered server interface or am I on the wrong track? So far I *have* had some success with COM clients and servers but I am obviously still a beginner here. Thanks, Pete --- Don Dwiggins wrote: > Peter Schay writes: > > I'm having a blast with Python and Pythonwin; they > are > > both really impressive. Normally I like to figure > > things out myself but there's just too much I > don't > > know at this point. I hope somebody can offer > > suggestions for how I can do the following: > > Sounds like you're well into exploring the > possibilities. If you haven't > already, I strongly recommend that you get Hammond & > Robinson's book "Python > programming for Win32" (an O'Reilly book); much of > what you're asking is > there, or can be figured out from there. > > I'd also recommend you visit Microsoft's MSDN pages, > where you can find more > than you ever wanted to know about automating Excel > (try Googling for [msdn > "excel object model"] to get quick access to the > right place). Warning: > Excel has one of the hairiest models I've run across > -- don't try to figure > it all out, but start with what you want to > accomplish and drill into what > looks like the right area ASAP. Plan to do a lot of > experimenting in > Pythonwin. > > Happy hunting, > -- > > Don Dwiggins "Experience is what you get when > d.l.dwiggins@computer.org you were expecting > something else." > -- Seen on an > office wall > > > _______________________________________________ > Python-win32 mailing list > Python-win32@python.org > http://mail.python.org/mailman/listinfo/python-win32 > From pyxis@iol.it Sun Feb 16 22:16:20 2003 From: pyxis@iol.it (=?iso-8859-1?Q?pyxis@iol.it?=) Date: Sun, 16 Feb 2003 23:16:20 +0100 Subject: [python-win32] =?iso-8859-1?Q?Calling_a_Windows_dll_(with_pointers_parameters)_with_calldll_?= Message-ID: Here is the code I used to call a Windows dll like that =0D=0A"""void FAR= PASCAL hllapi(int FAR *, char FAR *, int FAR *, int FAR *)""" =0D=0Awith= calldll (http://www.nightmare.com/software.html).=0D=0A=0D=0AFor me, wit= hout documentation, calling a windows dll who needs pointers was a nightm= are.=0D=0A=0D=0AAnd then I'd like to show you the code (may this 'll be u= seful to you).=0D=0A=0D=0APS=0D=0AYes, I know there is ctypes =0D=0A(http= ://starship.python.net/crew/theller/ctypes.html) but with ctypes it's too= easy to do ;-)=0D=0A=0D=0A=0D=0A# PROGRAM NAME : HLLAPI interface - call= dll version=0D=0A# Author: Stefano Spinucci=0D=0A# Written: 2002/02/16=0D= =0A# DESCRIPTION=0D=0A# This program interface the 3270 HLLAPI library of= an Italian 3270 emulator using =0D=0A# the calldll library =0D=0A# (from= Sam Rushing http://www.nightmare.com/software.html)=0D=0A# I've found ve= ry useful also edll.py from =0D=0A# http://pages.ccapcable.com/lac/underg= roundPython.html=0D=0A# The calling scheme for the function is :=0D=0A# v= oid FAR PASCAL hllapi(int FAR *, char FAR *, int FAR *, int FAR *);=0D=0A= =0D=0A# -----------------------------------------------------------------= -------------------------------=0D=0A# Function defining : =0D=0A# - myPr= intLong : given a membuf with a long inside, print the long=0D=0A# - myPr= intString : given a membuf with a string inside, print the string=0D=0A# = - mySetLong : given a membuf with a long inside len (4), set his value wi= th the long passed=0D=0A# -----------------------------------------------= -------------------------------------------------=0D=0A=0D=0Adef myPrintL= ong(vVar):=0D=0A #Print the long (first way)=0D=0A a=3D struct.unpack('I'= , vVar.read())[0]=0D=0A print a=0D=0A=0D=0A #Print the long (second way)=0D= =0A print calldll.read_long(vVar.address())=0D=0A=0D=0Adef myPrintString(= vVar):=0D=0A #Print the string (first way)=0D=0A a =3D vVar.read()=0D=0A = print a[:len(a)-1]=0D=0A print len(a)=0D=0A=0D=0A #Print the string (seco= nd way)=0D=0A a =3D calldll.read_string(vVar.address())=0D=0A print a=0D=0A= print len(a)=0D=0A=0D=0Adef mySetLong(vMemBuf, vValueToSet):=0D=0A strin= g_packed =3D struct.pack("L",vValueToSet) # packed as unsigned long=0D=0A= vMemBuf.write(string_packed)=0D=0A=0D=0Adef mySetString(vMemBuf, vValueT= oSet):=0D=0A data_len =3D len(vValueToSet) =0D=0A pack_format =3D str(dat= a_len+1)+"s" # add one for \0 at the end. =0D=0A string_packed =3D struct= .pack(pack_format, vValueToSet) # pack() will add \0 for us=0D=0A vMemBuf= .write(string_packed)=0D=0A=0D=0A# --------------------------------------= ----------------------------------------------------------=0D=0A# Import = the required library=0D=0A# ---------------------------------------------= ---------------------------------------------------=0D=0A=0D=0A#Import th= e calldll module=0D=0Aimport calldll=0D=0A#Import the struct module (a st= andard python module)=0D=0Aimport struct=0D=0A=0D=0A# -------------------= -------------------------------------------------------------------------= ----=0D=0A# Get the handle of the dll and the address of the function=0D=0A= # -----------------------------------------------------------------------= -------------------------=0D=0A=0D=0A#Get the handle of the Dll=0D=0Ahand= le =3D calldll.load_library ('C:\Tee3270\Ehllap32')=0D=0A=0D=0A#Get the a= ddress of the function=0D=0Aaddress =3D calldll.get_proc_address (handle,= 'HLLAPI')=0D=0A=0D=0A# -------------------------------------------------= -----------------------------------------------=0D=0A# Initialization=0D=0A= # -----------------------------------------------------------------------= -------------------------=0D=0A# vFunction, vTextLen and vResult are defi= ned as a membuf with lenght =3D 4, because 4 is the lenght =0D=0A# of an = unsigned long packed with struct.pack("L", NumberToPack)=0D=0AvFunction =3D= calldll.membuf(4)=0D=0AvTextLen =3D calldll.membuf(4)=0D=0AvResult =3D c= alldll.membuf(4)=0D=0A# vFunction is defined as a membuf with lenght =3D = 1921 because the dll needs a buffer of =0D=0A# 1920 char + 1 for \0 at th= e end=0D=0AvText =3D calldll.membuf(1921)=0D=0A=0D=0A# ------------------= -------------------------------------------------------------------------= -----=0D=0A# Function calling=0D=0A# ------------------------------------= ------------------------------------------------------------=0D=0A=0D=0A#= Vars setting=0D=0A#1=0D=0AmySetLong(vFunction, 1)=0D=0A#2=0D=0Astring_va= lue_to_write =3D 'A'=0D=0AmySetString(vText, string_value_to_write)=0D=0A= #3=0D=0AmySetLong(vTextLen, len(string_value_to_write))=0D=0A#4=0D=0AmySe= tLong(vResult, 1)=0D=0A=0D=0A#Call the function=0D=0Acalldll.call_foreign= _function (=0D=0A address,=0D=0A 'llll',=0D=0A 'l',=0D=0A (vFunct= ion.address(), vText.address(), vTextLen.address(), vResult.address())=0D= =0A )=0D=0A=0D=0A=0D=0AmyPrintLong(vResult)=0D=0AmyPrintString(vText)=0D= =0A=0D=0A# --------------------------------------------------------------= ----------------------------------=0D=0A# Dll unloading=0D=0A# ----------= -------------------------------------------------------------------------= -------------=0D=0A=0D=0A#Unload the dll=0D=0Acalldll.free_library (handl= e)=0D=0A From brian@zope.com Wed Feb 19 21:50:54 2003 From: brian@zope.com (Brian Lloyd) Date: Wed, 19 Feb 2003 16:50:54 -0500 Subject: [python-win32] ANN: Python Scripting for .NET Message-ID: (I originally posted this to python-announce, but Itamar reminded me that it would probably be better posted here...) For those interested in .NET integration - I've finally been able to post an initial (experimental) version of Python Scripting for .NET: http://www.zope.org/Members/Brian/PythonNet/index_html Python Scripting for .NET is an integration of the CPython runtime with the .NET CLR. For more info, see the FAQ: http://www.zope.org/Members/Brian/PythonNet/FAQ.html Brian Lloyd brian@zope.com V.P. Engineering 540.361.1716 Zope Corporation http://www.zope.com From william.rooney@us.transport.bombardier.com Fri Feb 21 13:49:56 2003 From: william.rooney@us.transport.bombardier.com (william.rooney@us.transport.bombardier.com) Date: Fri, 21 Feb 2003 08:49:56 -0500 Subject: [python-win32] Python COM User Defined Types Message-ID: I am using ActivePython 2.2 Build 224 on Microsoft Windows 2000 SP2. I have a COM server that has some User Defined Types in the .idl file. These UDTs are parameters in some of the methods. I have run makepy against the type library of the COM server, with the -i option and included the two lines in my Python code. All of the documentation that I have found regarding "records" and "structs" in COM servers has indicated that I should be able to to use this COM server with early binding and also be able use these UDTs. My problem is that I can not seem to actually do it. I wonder if I misunderstood the documents that I found. Also the mk:@MSITStore:C:\Python22\Doc\win32com.chm::/messages.html in the help file (and Classes and class members, Functions, and Structures and Enumberations) is empty. How can I create variables in my Python code and use them when calling the WriteMsg2 method (below)? Why do I not get a list of available constants when I type "win32com.clients.constants." Typically after entering the period at the end of an object I am presented with a list of attributes/constants/methods. I am concerned by these lines from the file generated by makepy: # The following 3 lines may need tweaking for the particular server # Candidates are pythoncom.Missing and pythoncom.Empty defaultNamedOptArg=pythoncom.Missing defaultNamedNotOptArg=pythoncom.Missing defaultUnnamedArg=pythoncom.Missing I do not know what to do about the pythoncom.Missing and pythoncom.Empty candidates. What should be done about them? Can I simply create an object of type StackObj like this: myStack = StackObj() Reference these two lines from the makepy generated file: # This CoClass is known by the name 'Stack.StackObj.1' class StackObj(CoClassBaseClass): # A CoClass snippet from Python code: stack = win32com.client.Dispatch("Stack.StackObj") snippet from the .idl: cpp_quote("#pragma pack(push) // save the default packing alignment, typically 8") cpp_quote("#pragma pack(1) // we rely on sizeof() for the sizes of these structures, tell the compiler not to pad") [ uuid(1FFA712A-14FB-4451-BE52-7B88BBE34DCE), helpstring("Revision Info: software and config version and protocol version") ] typedef struct tagREVISION_LEVELS2 { short software_rev; long config_rev; BYTE icd_rev; } REVISION_LEVELS2; cpp_quote("#pragma pack(pop) // restore the default packing alignment") interface IStackObj : IDispatch { ... [id(7), helpstring("method WriteMsg2")] HRESULT WriteMsg2([in] struct tagVB_REVISION_LEVELS2* pRevisionInfo, [in] struct tagVB_HEADER_INFO2* pHeader, [in,out] SAFEARRAY(BYTE)* psaMsg); } Thanks for all your help, ----Bill Rooney From jens.jorgensen@tallan.com Fri Feb 21 15:38:42 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Fri, 21 Feb 2003 09:38:42 -0600 Subject: [python-win32] Python COM User Defined Types In-Reply-To: References: Message-ID: <3E564802.8090108@tallan.com> I don't know if this is true or not but I'm going to guess that UDTs are supported /if/ they have an IRecordInfo for them. This is a COM interface that can actually handle all manipulation of the UDT. VB generates these for its UDTs and this is how Automation-compatible languages support them. I'm guessing Mark will comment on this. william.rooney@us.transport.bombardier.com wrote: >I am using ActivePython 2.2 Build 224 on Microsoft Windows 2000 SP2. > >I have a COM server that has some User Defined Types in the .idl file. These >UDTs are parameters in some of the methods. >I have run makepy against the type library of the COM server, with the -i option > and included the two lines in my Python code. >All of the documentation that I have found regarding "records" and "structs" in >COM servers has indicated that I should be able to >to use this COM server with early binding and also be able use these UDTs. My >problem is that I can not seem to actually do it. >I wonder if I misunderstood the documents that I found. Also the >mk:@MSITStore:C:\Python22\Doc\win32com.chm::/messages.html >in the help file (and Classes and class members, Functions, and Structures and >Enumberations) is empty. > >How can I create variables in my Python code and use them when calling the >WriteMsg2 method (below)? Why do I not get a list of >available constants when I type "win32com.clients.constants." Typically after >entering the period at the end of an object I am presented >with a list of attributes/constants/methods. > > >I am concerned by these lines from the file generated by makepy: ># The following 3 lines may need tweaking for the particular server ># Candidates are pythoncom.Missing and pythoncom.Empty >defaultNamedOptArg=pythoncom.Missing >defaultNamedNotOptArg=pythoncom.Missing >defaultUnnamedArg=pythoncom.Missing > >I do not know what to do about the pythoncom.Missing and pythoncom.Empty >candidates. What should be done about them? > >Can I simply create an object of type StackObj like this: >myStack = StackObj() >Reference these two lines from the makepy generated file: ># This CoClass is known by the name 'Stack.StackObj.1' >class StackObj(CoClassBaseClass): # A CoClass > > >snippet from Python code: >stack = win32com.client.Dispatch("Stack.StackObj") > >snippet from the .idl: > cpp_quote("#pragma pack(push) // save the default packing alignment, typically > 8") > cpp_quote("#pragma pack(1) // we rely on sizeof() for the sizes of these >structures, tell the compiler not to pad") > [ > uuid(1FFA712A-14FB-4451-BE52-7B88BBE34DCE), > helpstring("Revision Info: software and config version and protocol >version") > ] > typedef struct tagREVISION_LEVELS2 > { > short software_rev; > long config_rev; > BYTE icd_rev; > } REVISION_LEVELS2; > cpp_quote("#pragma pack(pop) // restore the default packing alignment") > > interface IStackObj : IDispatch > { > ... > [id(7), helpstring("method WriteMsg2")] HRESULT WriteMsg2([in] struct >tagVB_REVISION_LEVELS2* pRevisionInfo, [in] struct tagVB_HEADER_INFO2* pHeader, >[in,out] SAFEARRAY(BYTE)* psaMsg); > } > >Thanks for all your help, >----Bill Rooney > > > >_______________________________________________ >Python-win32 mailing list >Python-win32@python.org >http://mail.python.org/mailman/listinfo/python-win32 > > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From lbates@syscononline.com Fri Feb 21 17:37:42 2003 From: lbates@syscononline.com (Larry Bates) Date: Fri, 21 Feb 2003 11:37:42 -0600 Subject: [python-win32] sys.excepthook not working as expected Message-ID: <006301c2d9cf$f052efa0$3f00a8c0@larrywxp> I have tried unsuccessfully to set my own function to handle uncaught exceptions. Below is a short test program that doesn't work as expected: import sys def Myexcepthook(type, value, traceback): print "in Myexcepthook" import traceback lines=traceback.format_exception(type, value, traceback) print "---------------------Traceback lines-----------------------" print "\n".join(lines) print "-----------------------------------------------------------" sys.exit(2) # # set sys.excepthook # sys.excepthook=Myexcepthook # # create an uncaught divide by zero exception # a=1/0 #---------------------End of program------------------------ When I execute this program I get: in Myexcepthook Error in sys.excepthook: Traceback (most recent call last): File "excepthooktest.py", line 6, in Myexcepthook lines=traceback.format_exception(type, value, traceback) File "C:\Python22\Lib\traceback.py", line 140, in format_exception list = list + format_tb(tb, limit) File "C:\Python22\Lib\traceback.py", line 75, in format_tb return format_list(extract_tb(tb, limit)) File "C:\Python22\Lib\traceback.py", line 94, in extract_tb f = tb.tb_frame AttributeError: 'module' object has no attribute 'tb_frame' Original exception was: Traceback (most recent call last): File "excepthooktest.py", line 20, in ? a=1/0 ZeroDivisionError: integer division or modulo by zero If I change: lines=traceback.format_exception(type, value, traceback) to lines=traceback.format_exception_only(type, value) Myexcepthook function behaves properly and prints: ---------------------Traceback lines----------------------- ZeroDivisionError: integer division or modulo by zero ----------------------------------------------------------- Anyone have any ideas. I would like to capture the traceback information as well as the exception. Also, the sys.excepthook override doesn't seem to work at all when I run this interactively, only works if run from console. BTW - I'm using ActiveState PythonWin 2.2.1 (#34, Apr 15 2002, 09:51:39) Thanks in advance, Larry Bates lbates@syscononline.com From jens.jorgensen@tallan.com Fri Feb 21 18:34:33 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Fri, 21 Feb 2003 12:34:33 -0600 Subject: [python-win32] sys.excepthook not working as expected In-Reply-To: <006301c2d9cf$f052efa0$3f00a8c0@larrywxp> References: <006301c2d9cf$f052efa0$3f00a8c0@larrywxp> Message-ID: <3E567139.70106@tallan.com> Well, you have been bit by a namespace issue. traceback the object is passed to Myexcepthook but you thereafter say "import traceback" which in effect means that you just lost that traceback object that you're passing to format_exception. Change your function to: def Myexcepthook(type, value, tb): print "in Myexcepthook" import traceback lines=traceback.format_exception(type, value, tb) print "---------------------Traceback lines-----------------------" print "\n".join(lines) print "-----------------------------------------------------------" sys.exit(2) Larry Bates wrote: >I have tried unsuccessfully to set my own function to handle uncaught >exceptions. >Below is a short test program that doesn't work as expected: > >import sys >def Myexcepthook(type, value, traceback): > print "in Myexcepthook" > import traceback > lines=traceback.format_exception(type, value, traceback) > print "---------------------Traceback lines-----------------------" > print "\n".join(lines) > print "-----------------------------------------------------------" > sys.exit(2) > > ># ># set sys.excepthook ># >sys.excepthook=Myexcepthook ># ># create an uncaught divide by zero exception ># >a=1/0 >#---------------------End of program------------------------ > >When I execute this program I get: > >in Myexcepthook >Error in sys.excepthook: >Traceback (most recent call last): >File "excepthooktest.py", line 6, in Myexcepthook >lines=traceback.format_exception(type, value, traceback) >File "C:\Python22\Lib\traceback.py", line 140, in format_exception >list = list + format_tb(tb, limit) >File "C:\Python22\Lib\traceback.py", line 75, in format_tb >return format_list(extract_tb(tb, limit)) >File "C:\Python22\Lib\traceback.py", line 94, in extract_tb >f = tb.tb_frame >AttributeError: 'module' object has no attribute 'tb_frame' > >Original exception was: >Traceback (most recent call last): >File "excepthooktest.py", line 20, in ? >a=1/0 >ZeroDivisionError: integer division or modulo by zero > >If I change: > >lines=traceback.format_exception(type, value, traceback) > >to > >lines=traceback.format_exception_only(type, value) > >Myexcepthook function behaves properly and prints: > >---------------------Traceback lines----------------------- >ZeroDivisionError: integer division or modulo by zero > >----------------------------------------------------------- > >Anyone have any ideas. I would like to capture the traceback information as >well as the exception. > >Also, the sys.excepthook override doesn't seem to work at all when I run >this interactively, only works if run from console. > >BTW - I'm using ActiveState PythonWin 2.2.1 (#34, Apr 15 2002, 09:51:39) > >Thanks in advance, >Larry Bates > >lbates@syscononline.com > > > >_______________________________________________ >Python-win32 mailing list >Python-win32@python.org >http://mail.python.org/mailman/listinfo/python-win32 > > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From jens.jorgensen@tallan.com Fri Feb 21 18:52:36 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Fri, 21 Feb 2003 12:52:36 -0600 Subject: [python-win32] sys.excepthook not working as expected In-Reply-To: <3E567139.70106@tallan.com> References: <006301c2d9cf$f052efa0$3f00a8c0@larrywxp> <3E567139.70106@tallan.com> Message-ID: <3E567574.50702@tallan.com> Jens B. Jorgensen wrote: > Well, you have been bit by a namespace issue. Hmmm, just read this and the above sounds like I'm suggesting there is a problem in Python. Of course there is not, this is just how the dynamic namespace works. > traceback the object is passed to Myexcepthook but you thereafter say > "import traceback" which in effect means that you just lost that > traceback object that you're passing to format_exception. Change your > function to: > > def Myexcepthook(type, value, tb): > print "in Myexcepthook" > import traceback > lines=traceback.format_exception(type, value, tb) > print "---------------------Traceback lines-----------------------" > print "\n".join(lines) > print "-----------------------------------------------------------" > sys.exit(2) > > > Larry Bates wrote: > >> I have tried unsuccessfully to set my own function to handle uncaught >> exceptions. >> Below is a short test program that doesn't work as expected: >> >> import sys >> def Myexcepthook(type, value, traceback): >> print "in Myexcepthook" >> import traceback >> lines=traceback.format_exception(type, value, traceback) print >> "---------------------Traceback lines-----------------------" >> print "\n".join(lines) >> print "-----------------------------------------------------------" >> sys.exit(2) >> >> >> # >> # set sys.excepthook >> # >> sys.excepthook=Myexcepthook >> # >> # create an uncaught divide by zero exception >> # >> a=1/0 >> #---------------------End of program------------------------ >> >> When I execute this program I get: >> >> in Myexcepthook >> Error in sys.excepthook: >> Traceback (most recent call last): >> File "excepthooktest.py", line 6, in Myexcepthook >> lines=traceback.format_exception(type, value, traceback) >> File "C:\Python22\Lib\traceback.py", line 140, in format_exception >> list = list + format_tb(tb, limit) >> File "C:\Python22\Lib\traceback.py", line 75, in format_tb >> return format_list(extract_tb(tb, limit)) >> File "C:\Python22\Lib\traceback.py", line 94, in extract_tb >> f = tb.tb_frame >> AttributeError: 'module' object has no attribute 'tb_frame' >> >> Original exception was: >> Traceback (most recent call last): >> File "excepthooktest.py", line 20, in ? >> a=1/0 >> ZeroDivisionError: integer division or modulo by zero >> >> If I change: >> >> lines=traceback.format_exception(type, value, traceback) >> >> to >> >> lines=traceback.format_exception_only(type, value) >> >> Myexcepthook function behaves properly and prints: >> >> ---------------------Traceback lines----------------------- >> ZeroDivisionError: integer division or modulo by zero >> >> ----------------------------------------------------------- >> >> Anyone have any ideas. I would like to capture the traceback >> information as >> well as the exception. >> >> Also, the sys.excepthook override doesn't seem to work at all when I run >> this interactively, only works if run from console. >> >> BTW - I'm using ActiveState PythonWin 2.2.1 (#34, Apr 15 2002, 09:51:39) >> >> Thanks in advance, >> Larry Bates >> >> lbates@syscononline.com >> >> >> >> _______________________________________________ >> Python-win32 mailing list >> Python-win32@python.org >> http://mail.python.org/mailman/listinfo/python-win32 >> >> > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From theller@python.net Fri Feb 21 19:42:21 2003 From: theller@python.net (Thomas Heller) Date: 21 Feb 2003 20:42:21 +0100 Subject: [python-win32] call for Windows developers Message-ID: <65rdmndu.fsf@python.net> I'm looking for one, two, or three experienced Python developers on Windows to participate in an exciting open-source project. As some people on this list might know, the ctypes project http://starship.python.net/crew/theller/ctypes.html has had a good start. In short, ctypes is an improved calldll replacement. The longer description is that it lets you in pure Python build, access, and manipulate simple, but also very complicated C data types (structures, unions, pointers, function pointers, callback functions) and use them to call functions in shared libraries/dlls. It currently runs on Windows, Linux, and MacOS X, the latter two with the help of the libffi library. Not only allows it to call, for example, win32 functions not (yet) exposed by Mark Hammond's win32all stuff, I think it is powerful enough to create bindings in pure Python to whole systems or frameworks. (That's the reason I think this post is not totally off-topic for this forum). Using ctypes is sometimes like programming C in a Python syntax, this may sound strange, but it's where I as a Python and C hacker feel quite at home ;-), just that I don't need the compiler any more... I would now like to create a COM framework. ctypes makes it easy to access COM vtables, and also easy to build them at runtime. Different from Mark's pythoncom, it would concentrate more on custom interfaces than on IDispatch - just what is needed if you have to interface to clients and servers implemented in ATL. My ultimate goal would be to be able to write ActiveX controls in pure Python, and write containers for AX controls in pure Python. So far, I have written proof-of-concept code with fairly good typelibrary/typeinfo support for both the client side and the server side. I have local and inproc servers running, can send and receive events via the connection point mechanism, can automatically create type libraries for COM interfaces written in Python, can decompile type libraries and generate Python source code wrappers for them, so that it's easy to use these interfaces in Python, and so on. All for simple cases only, though. As things usually go, I'm not happy with this code, although I've learned a lot, and started the first rewrite. The rewritten code is in the ctypes CVS repository, in a sandbox subdirectory. Supporting open-source projects is a large goal, and I'm quite sure I cannot do it for the ctypes COM stuff alone. So currently I have to decide whether this stays at the level of 'ctypes sample code', or if it will evolve into a useful addition to the Python toolkit on Windows, but, I need some help. Thanks for the attention, Thomas From kfarmer@thuban.org Fri Feb 21 22:12:06 2003 From: kfarmer@thuban.org (Keith J. Farmer) Date: Fri, 21 Feb 2003 14:12:06 -0800 Subject: [python-win32] call for Windows developers Message-ID: VGhpcyBzaG91bGQgYWxzbyBhbGxvdyBzb21lIHBhdGh3YXkgYmV0d2VlbiBQeXRob24gYW5kIC5O RVQgKG5vdCB0aGF0IG9uZSBkb2Vzbid0IGV4aXN0LCBidXQgdGhlIHBhdGh3YXkgbWF5IGJlIHNv bWV3aGF0IGxlc3MgcHJpbWl0aXZlKS4gIEkga2luZGEgbGlrZSB0aGF0ICh0aG91Z2ggSSdkIHBy ZWZlciBhIENMUi1jb21waWxlYWJsZSBQeXRob24sIGJ1dCB0aGF0J3Mgbm90IGxpa2VseSkuDQoN CgktLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLSANCglGcm9tOiBUaG9tYXMgSGVsbGVyIFttYWls dG86dGhlbGxlckBweXRob24ubmV0XSANCglTZW50OiBGcmkgMi8yMS8yMDAzIDExOjQyIEFNIA0K CSANCglJIHdvdWxkIG5vdyBsaWtlIHRvIGNyZWF0ZSBhIENPTSBmcmFtZXdvcmsuICBjdHlwZXMg bWFrZXMgaXQgZWFzeSB0bw0KCWFjY2VzcyBDT00gdnRhYmxlcywgYW5kIGFsc28gZWFzeSB0byBi dWlsZCB0aGVtIGF0IHJ1bnRpbWUuICBEaWZmZXJlbnQNCglmcm9tIE1hcmsncyBweXRob25jb20s IGl0IHdvdWxkIGNvbmNlbnRyYXRlIG1vcmUgb24gY3VzdG9tIGludGVyZmFjZXMNCgl0aGFuIG9u IElEaXNwYXRjaCAtIGp1c3Qgd2hhdCBpcyBuZWVkZWQgaWYgeW91IGhhdmUgdG8gaW50ZXJmYWNl IHRvDQoJY2xpZW50cyBhbmQgc2VydmVycyBpbXBsZW1lbnRlZCBpbiBBVEwuDQoNCg== From theller@python.net Mon Feb 24 12:11:19 2003 From: theller@python.net (Thomas Heller) Date: 24 Feb 2003 13:11:19 +0100 Subject: [python-win32] call for Windows developers In-Reply-To: References: Message-ID: <65r9g9p4.fsf@python.net> "Keith J. Farmer" writes: > This should also allow some pathway between Python and .NET (not that > one doesn't exist, but the pathway may be somewhat less primitive). I > kinda like that (though I'd prefer a CLR-compileable Python, but > that's not likely). Hm, personally I have no need for .NET nor do I know what would be required for this. Is there an opportunity for ctypes? Thomas From kfarmer@thuban.org Mon Feb 24 17:25:53 2003 From: kfarmer@thuban.org (Keith J. Farmer) Date: Mon, 24 Feb 2003 09:25:53 -0800 Subject: [python-win32] call for Windows developers Message-ID: T2JqZWN0cyB3cml0dGVuIGluIG9uZSBtYXkgYmUgdXNlZCBieSB0aGUgb3RoZXIuDQoNCgktLS0t LU9yaWdpbmFsIE1lc3NhZ2UtLS0tLSANCglGcm9tOiBUaG9tYXMgSGVsbGVyIFttYWlsdG86dGhl bGxlckBweXRob24ubmV0XSANCglTZW50OiBNb24gMi8yNC8yMDAzIDQ6MTEgQU0gDQoJIA0KCUht LCBwZXJzb25hbGx5IEkgaGF2ZSBubyBuZWVkIGZvciAuTkVUIG5vciBkbyBJIGtub3cgd2hhdCB3 b3VsZCBiZQ0KCXJlcXVpcmVkIGZvciB0aGlzLiAgSXMgdGhlcmUgYW4gb3Bwb3J0dW5pdHkgZm9y IGN0eXBlcz8NCgkNCg0K From william.rooney@us.transport.bombardier.com Fri Feb 21 13:44:15 2003 From: william.rooney@us.transport.bombardier.com (william.rooney@us.transport.bombardier.com) Date: Fri, 21 Feb 2003 08:44:15 -0500 Subject: [python-win32] Python COM User Defined Types Message-ID: I am using ActivePython 2.2 Build 224 on Microsoft Windows 2000 SP2. I have a COM server that has some User Defined Types in the .idl file. These UDTs are parameters in some of the methods. I have run makepy against the type library of the COM server, with the -i option and included the two lines in my Python code. All of the documentation that I have found regarding "records" and "structs" in COM servers has indicated that I should be able to to use this COM server with early binding and also be able use these UDTs. My problem is that I can not seem to actually do it. I wonder if I misunderstood the documents that I found. Also the mk:@MSITStore:C:\Python22\Doc\win32com.chm::/messages.html in the help file (and Classes and class members, Functions, and Structures and Enumberations) is empty. How can I create variables in my Python code and use them when calling the WriteMsg2 method (below)? Why do I not get a list of available constants when I type "win32com.clients.constants." Typically after entering the period at the end of an object I am presented with a list of attributes/constants/methods. I am concerned by these lines from the file generated by makepy: # The following 3 lines may need tweaking for the particular server # Candidates are pythoncom.Missing and pythoncom.Empty defaultNamedOptArg=pythoncom.Missing defaultNamedNotOptArg=pythoncom.Missing defaultUnnamedArg=pythoncom.Missing I do not know what to do about the pythoncom.Missing and pythoncom.Empty candidates. What should be done about them? Can I simply create an object of type StackObj like this: myStack = StackObj() Reference these two lines from the makepy generated file: # This CoClass is known by the name 'Stack.StackObj.1' class StackObj(CoClassBaseClass): # A CoClass snippet from Python code: stack = win32com.client.Dispatch("Stack.StackObj") snippet from the .idl: cpp_quote("#pragma pack(push) // save the default packing alignment, typically 8") cpp_quote("#pragma pack(1) // we rely on sizeof() for the sizes of these structures, tell the compiler not to pad") [ uuid(1FFA712A-14FB-4451-BE52-7B88BBE34DCE), helpstring("Revision Info: software and config version and protocol version") ] typedef struct tagREVISION_LEVELS2 { short software_rev; long config_rev; BYTE icd_rev; } REVISION_LEVELS2; cpp_quote("#pragma pack(pop) // restore the default packing alignment") interface IStackObj : IDispatch { ... [id(7), helpstring("method WriteMsg2")] HRESULT WriteMsg2([in] struct tagVB_REVISION_LEVELS2* pRevisionInfo, [in] struct tagVB_HEADER_INFO2* pHeader, [in,out] SAFEARRAY(BYTE)* psaMsg); } Thanks for all your help, ----Bill Rooney From antone.heyward@verizon.net Sun Feb 23 05:43:16 2003 From: antone.heyward@verizon.net (Antone) Date: Sun, 23 Feb 2003 00:43:16 -0500 Subject: [python-win32] Win32 and excel charts Message-ID: <000001c2dafe$76e7db50$6001a8c0@blakout> I am trying to use data from an excel spreadsheet and create a graph in excel with the data. Does anyone have a good example? I can create a blank graph with Charts.Add() but thats it. From tony@tcapp.com Sun Feb 23 08:06:43 2003 From: tony@tcapp.com (Tony Cappellini) Date: Sun, 23 Feb 2003 00:06:43 -0800 Subject: [python-win32] range() broken in win32all Build 152 Message-ID: <5.1.0.14.0.20030223000609.04c98aa0@smtp.sbcglobal.net> --=====================_5433342==_ Content-Type: text/plain; charset="us-ascii"; format=flowed Has anyone seen this problem ? type this in Python Win print range (0,1000) On my Win2k system, PythonWin displays a list up to 771, only. Obviously, it should go up to 999. I'm curious if anyone else can duplicate this.. Attached is a screenshot- Tony --=====================_5433342==_ Content-Type: image/jpeg; name="range().jpg"; x-mac-type="4A504547"; x-mac-creator="4A565752" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="range().jpg" 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 6LyWLlixcuixlly7gbguJym4Vu45W1fiyn+iCER1qSqKrVUVUFUQpShR2ER1qSEyNQVUFUQJQo7C IGpIKrUDU6qiFKUKOwiBqSqKofSqKrVUVQlCqpqiBqSEVQ+lUVWqohCUKqmEQNSVRA+lUVUFUQhK FqO1df8AeSKuVwfyrFOOquKuV8a9qcRkijnGUP5VkV1VwsGmvjXtRwjJdqxSjL5UUrVeJNNfHi5r rJdqYyll1V6k8dV4sXK+Vc0lDXaMxlGXVXuKeOqukey+R7Q6jXtDEZdUdU4oq6Q7r5pPtnA3BaBO U/kib1Z1t7E9ebqNlhMfyRPVnE9J7ZwNljFynxT1Zas4t7E9lwN9sJynxT3HKdWdbdJ7bg32wh8U 9T1Z1t7k9s4G+2E5T4p6m9Wdbe21B6RA4OTCHERiQnqMY5KULkxiQOCMSEOIjEjF6jGOSlCjGfVE DieISQ4iMSMXqMI5KUKMRViBxPqQhxHrMYwekclKF6z6RA4n1EkOI9Z9Xr1jja4vU9SBxPqQhxHC E9RjHJXNwyjhGSbKeylD+UIa1VvFJypiHNHHZyTbp3FND+VIa1VvFYuVMQ5WHqNOadUofyok1qri rFMQ5q46NOasUoy+VZDWquK+y+Q5q46NOasUmXyvYjVXFXK+Q5o46NOauVKMvlXKTWquEnK+aT7d 1MnBbuOUrJwrGOWr+tulvazeJk4bz7i5WThWMctWdbOSfazgbhy0J8ycKWLLVnWzsT15OBuHLQnz JwpYm9WdVk7E9eTSG4d2JmThWcrLV3Cylliz0327McpWThWc45au4WXtvhbHTglHGMlHHqcYlC4c mVpwSjgyUcepUcPhKmcdcJRwZKPXLUqJU/CUTjrhKODJRx6lRyfhKJWuEo4MlHHqcY4fCUWx1yZR wcEo49TjHJ3WSvOy02UEmh/KFWtVcLCBTFe052Wmyh0fyhDWquKdUxXtOdGmygk0PqoQ9VcLCGpi vfHzo1JQSaH8qQ1qosYFMPGSp0akoYpofypVrVRYQ18eMledGpKCTQ+qosWtV5Xq+aT9resmTgt1 Pj+WFlqzrZ3Tkn2s6yZOC3cXzL5YTjVnWzunJPtZ1kycFhMy+W6stW5PsnJPbOJMnDszHKVl8t3H LVuT7rpPZdZMn2xi+ZfLdxy1Z1n2XSfa3JMn2wmZfJcrLhZ1l3XdyWWm4JR91KJT1ZEqSSy1MFkf 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 --=====================_5433342==_-- From nils@paragon.no Tue Feb 25 13:40:58 2003 From: nils@paragon.no (Nils R Grotnes) Date: Tue, 25 Feb 2003 14:40:58 +0100 Subject: [python-win32] range() broken in win32all Build 152 References: <5.1.0.14.0.20030223000609.04c98aa0@smtp.sbcglobal.net> Message-ID: Tony >Has anyone seen this problem ? Yes! :-) >type this in Python Win >print range (0,1000) Try this: print len(range(1000)) It's a limitation (some would say bug) in your editor. Nils From mhammond@skippinet.com.au Wed Feb 26 05:45:35 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Wed, 26 Feb 2003 16:45:35 +1100 Subject: [python-win32] Python COM User Defined Types In-Reply-To: Message-ID: > How can I create variables in my Python code and use them when calling the > WriteMsg2 method (below)? You would write: # Create a new structure s = win32com.client.Record("StructName", object) where 'object' is (any) COM object from the library you are using - eg, the object with the WriteMsg2 method. > Why do I not get a list of > available constants when I type "win32com.clients.constants." These constants are only available once the generated code for the COM object has been imported. This is generally done by one of the gencache modules, or even by normal "Dispatch()", assuming makepy has been run manually. ie, the constants will only be available after the object has been created. > Typically after > entering the period at the end of an object I am presented > with a list of attributes/constants/methods. Clever, eh? > I am concerned by these lines from the file generated by makepy: > # The following 3 lines may need tweaking for the particular server > # Candidates are pythoncom.Missing and pythoncom.Empty > defaultNamedOptArg=pythoncom.Missing > defaultNamedNotOptArg=pythoncom.Missing > defaultUnnamedArg=pythoncom.Missing > > I do not know what to do about the pythoncom.Missing and pythoncom.Empty > candidates. What should be done about them? Ignore them. I should remove the generated comment. > Can I simply create an object of type StackObj like this: > myStack = StackObj() Nope - like above. Mark. From jens.jorgensen@tallan.com Wed Feb 26 15:10:29 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Wed, 26 Feb 2003 09:10:29 -0600 Subject: [python-win32] Python COM User Defined Types In-Reply-To: References: Message-ID: <3E5CD8E5.1040409@tallan.com> Is there any pre-requisite for the Record call (aside from having the makepy-generated module available)? I tried this and it wouldn't work for me (UDT defined in VB ActiveX dll): >>> from win32com.client import Record >>> from win32com.client import Dispatch >>> o = Dispatch('udttest.mainclass') >>> r = Record('TheUDT', o) Traceback (most recent call last): File "", line 1, in ? File "C:\Python22\Lib\site-packages\win32com\client\__init__.py", line 295, in Record struct_guid = module.RecordMap[name] AttributeError: 'module' object has no attribute 'RecordMap' >>> Mark Hammond wrote: >>How can I create variables in my Python code and use them when calling the >>WriteMsg2 method (below)? >> >> > >You would write: > > # Create a new structure > s = win32com.client.Record("StructName", object) > >where 'object' is (any) COM object from the library you are using - eg, the >object with the WriteMsg2 method. > > > >>Why do I not get a list of >>available constants when I type "win32com.clients.constants." >> >> > >These constants are only available once the generated code for the COM >object has been imported. This is generally done by one of the gencache >modules, or even by normal "Dispatch()", assuming makepy has been run >manually. ie, the constants will only be available after the object has >been created. > > > >>Typically after >>entering the period at the end of an object I am presented >>with a list of attributes/constants/methods. >> >> > >Clever, eh? > > > >>I am concerned by these lines from the file generated by makepy: >># The following 3 lines may need tweaking for the particular server >># Candidates are pythoncom.Missing and pythoncom.Empty >>defaultNamedOptArg=pythoncom.Missing >>defaultNamedNotOptArg=pythoncom.Missing >>defaultUnnamedArg=pythoncom.Missing >> >>I do not know what to do about the pythoncom.Missing and pythoncom.Empty >>candidates. What should be done about them? >> >> > >Ignore them. I should remove the generated comment. > > > >>Can I simply create an object of type StackObj like this: >>myStack = StackObj() >> >> > >Nope - like above. > >Mark. > > >_______________________________________________ >Python-win32 mailing list >Python-win32@python.org >http://mail.python.org/mailman/listinfo/python-win32 > > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From vishnu_mahendra@yahoo.com Wed Feb 26 15:07:23 2003 From: vishnu_mahendra@yahoo.com (vishnu mahendra) Date: Wed, 26 Feb 2003 07:07:23 -0800 (PST) Subject: [python-win32] printing Message-ID: <20030226150723.81958.qmail@web40802.mail.yahoo.com> i am new to python so please tell me hot to take a print of a database or simply print "Hello World" in the printer using win32 modules. i am using windows me python 2.0 thank you in advance, vishnu __________________________________________________ Do you Yahoo!? Yahoo! Tax Center - forms, calculators, tips, more http://taxes.yahoo.com/ From daniel.warren@amd.com Wed Feb 26 19:47:08 2003 From: daniel.warren@amd.com (daniel.warren@amd.com) Date: Wed, 26 Feb 2003 11:47:08 -0800 Subject: [python-win32] getting reliable data from win32pdh Message-ID: Hi, I'm trying to use the win32pdhquery interface to the windows performance counters to watch the activity of certain programs. I wrote a simple script which chooses the data to log, runs the collectdatawhile() routine, runs the program to watch, and then saves the data to a CSV file, in the same format as the windows perfmon does. However, the data it logs has a lot of zeroes in it, suggesting that it couldn't actually sample the counter that instant. Some counters virtually never get sampled, others will get data 1 out of 5 times for the first 30sec or so, and then will just be all zeros. Yet others will have a relatively complete set. The built in windows perfmon GUI seems to have a much higher hit rate - some counters it also can't seem to latch on to, but when it does, the data is nearly always there. I tried increasing the priority of the collectdatawhile_slave() thread, which fixed a different problem I was having (under heavy load, the logging interval would be irre! gular - anywhere from 1 sec to 3.2 sec, although I wanted every second). Unfortunately, that didn't change the success rate in gathering meaningful data. It is like that idle as well as under load. I've tried on a few systems, running various versions of Win2K and WinXP, running Python 2.2.2. Any suggestions? Thanks, Dan From jens.jorgensen@tallan.com Wed Feb 26 20:10:55 2003 From: jens.jorgensen@tallan.com (Jens B. Jorgensen) Date: Wed, 26 Feb 2003 14:10:55 -0600 Subject: [python-win32] printing In-Reply-To: <20030226150723.81958.qmail@web40802.mail.yahoo.com> References: <20030226150723.81958.qmail@web40802.mail.yahoo.com> Message-ID: <3E5D1F4F.5090809@tallan.com> This is probably more a Windows question than a Python one. If you can show me how you would print something in C then I'll show you how to do it in Python. In other words the win32 modules are a convenient wrapper for the win32 C api. vishnu mahendra wrote: >i am new to python > >so please tell me hot to take a print of a database >or simply print "Hello World" in the printer using >win32 modules. > >i am using > >windows me >python 2.0 >thank you in advance, >vishnu > > >__________________________________________________ >Do you Yahoo!? >Yahoo! Tax Center - forms, calculators, tips, more >http://taxes.yahoo.com/ > >_______________________________________________ >Python-win32 mailing list >Python-win32@python.org >http://mail.python.org/mailman/listinfo/python-win32 > > -- Jens B. Jorgensen jens.jorgensen@tallan.com "With a focused commitment to our clients and our people, we deliver value through customized technology solutions" From mhammond@skippinet.com.au Wed Feb 26 21:22:36 2003 From: mhammond@skippinet.com.au (Mark Hammond) Date: Thu, 27 Feb 2003 08:22:36 +1100 Subject: [python-win32] Python COM User Defined Types In-Reply-To: <3E5CD8E5.1040409@tallan.com> Message-ID: > Is there any pre-requisite for the Record call (aside from having the > makepy-generated module available)? I tried this and it wouldn't work > for me (UDT defined in VB ActiveX dll): The record must be defined with a GUID. My memory is sketchy about exactly what tools do and do not do this. However, there is such code in the COM test suite that works. Mark. From Matt.Wilbert@state.ma.us Thu Feb 27 16:31:24 2003 From: Matt.Wilbert@state.ma.us (Wilbert, Matt (ENV)) Date: Thu, 27 Feb 2003 11:31:24 -0500 Subject: [python-win32] ADO/ADSI script works, but not in ASP Message-ID: <6B4AC3A142A99446A5FEA2AE28B2F05A19C4F7@ES-MSG-006.es.govt.state.ma.us> I am having a problem getting Active Directory information from within = an ASP page. It may help you to know that I have very limited experience with ASP. This running under Windows 2000, IIS 5, ActivePython 2.2.1 MDAC 2.6. I have constructed a minimal example. If open the page below, I get at "table does not exist" error (full = error message also below) If I call smallTestTable() from a regular python script on the same = server, it works as expected. I presume there is some additional magic you need to do in ASP, but I = have been unable to figure out what that magic is. Thanks for any insights you may have, Matt Wilbert -----------------test.asp --------------------------- <%=3DsmallTestTable%>
----------end test.asp------------------- Error Type: Python ActiveX Scripting Engine (0x80020009) Traceback (innermost last): File " >----------end test.asp------------------- > >Error Type: >Python ActiveX Scripting Engine (0x80020009) >Traceback (innermost last): File " >----------end test.asp------------------- > >Error Type: >Python ActiveX Scripting Engine (0x80020009) >Traceback (innermost last): File " >>----------end test.asp------------------- >> >>Error Type: >>Python ActiveX Scripting Engine (0x80020009) >>Traceback (innermost last): File "