accessing an OLE Automation (IDispatch) server from python which requires the use of "out params"

bitbucket coder1024 at
Tue Dec 11 16:48:53 CET 2012

On Monday, December 10, 2012 8:16:43 PM UTC-5, Mark Hammond wrote:
> "out" params are best supported if the object supplied a typelib - then 
> Python knows the params are out and does the right thing automagically. 
>   If out params are detected, the result of the function will be a tuple 
> of (real_result, out_param1, ...)
> Even if no typelib is supported, you can access them with a little pain 
> via the win32com.client.Dispatch() object.  You might like to follow up 
> to the python-win32 at mailing list where many people will be 
> able to help.
> HTH,
> Mark

Mark, thanks for the reply.  In this case, I have a type library and attempted to use MakePy but it doesn't seem to be working as expected.

I was reading through CH12 of your Python Programming on Win32 book (  I was hopeful given your description of MakePy that I could get this to work.  It appears that you're saying MakePy will convert "byref" args in a function over to return values.

For example, the IDL in the server includes the following 3 functions.

			[id(1)] void ShowMessage(BSTR msg);
			[id(2)] void GetSettingValue(BSTR settingName, BSTR* settingValue);
			[id(3)] void SetSettingValue(BSTR settingName, BSTR settingValue);

The thorny one is the GetSettingValue since it takes the out param.  When I run MakePy, it generates the below.

	def ShowMessage(self, msg=defaultNamedNotOptArg):
		return self._oleobj_.InvokeTypes(1, LCID, 1, (24, 0), ((8, 0),),msg

	def GetSettingValue(self, settingName=defaultNamedNotOptArg, settingValue=defaultNamedNotOptArg):
		return self._oleobj_.InvokeTypes(2, LCID, 1, (24, 0), ((8, 0), (16392, 0)),settingName
			, settingValue)

	def SetSettingValue(self, settingName=defaultNamedNotOptArg, settingValue=defaultNamedNotOptArg):
		return self._oleobj_.InvokeTypes(3, LCID, 1, (24, 0), ((8, 0), (8, 0)),settingName
			, settingValue)

I noticed that the argument type is different for the out param (16392 instead of 8).  However, it doesn't appear to me that its generating return values instead of args (though I'm not very experienced in python).

I tried invoking these in python.  The ShowMessage and SetSettingValue work great.  I can't get the GetSettingValue to work though.  Perhaps there's a different syntax I need when using the MakePy generated code?

More information about the Python-list mailing list