'Member not found.' problem with win32com.client.
Peter Haight
peterh at sapros.com
Sun Jul 8 20:30:52 EDT 2001
I'm trying to use the automation interface to the Windows Installer stuff
and am having a problem. I used 'makepy.py' on 'Microsoft Windows Installer
Object Library (1.0)' which created a nice interface file, but it doesn't
quite work.
First of all, it looks like the COM object doesn't support GetTypeInfo so I
have to make the classes manually, but I'm also getting a 'Member not
found.' error when I call some methods.
I can kind of get around this by not using the wrapper module, but then I
was getting the same error for 'error.StringData(1)'. Now as you can see in
my work-around version, I can fix that by wrapping error.
Here's my code:
---------------
import shutil
import win32com.client
import win32com.client.gencache
template_installer_name = 'EmptyInstaller.msi'
project_installer_name = 'test.msi'
shutil.copy(template_installer_name, project_installer_name)
wininst = win32com.client.gencache.GetModuleForProgID("WindowsInstaller.Installer")
o = wininst.Installer(win32com.client.Dispatch("WindowsInstaller.Installer"))
db = o.OpenDatabase(project_installer_name,
win32com.client.constants.msiOpenDatabaseModeTransact)
query_str = "select from Directory where DefaultDir = 'SourceDir' and Directory_Parent = ''"
try:
view = db.OpenView(query_str)
except:
error = o.LastErrorRecord()
for field_num in range(1, error.FieldCount + 1):
print error.StringData(field_num)
-------------
Here's the traceback I get when I run it:
-------------
Traceback (most recent call last):
File "winstall.py", line 18, in ?
error = o.LastErrorRecord()
File "c:\programs\lang\python\win32com\gen_py\000C1092-0000-0000-C000-000000000046x1033x1x0.py", line 357, in LastErrorRecord
ret = self._oleobj_.InvokeTypes(0xa, LCID, 1, (9, 0), (),)
pywintypes.com_error: (-2147352573, 'Member not found.', None, None)
-------------
Here's the method in the generated module file:
-------------
# Result is of type Record
def LastErrorRecord(self):
ret = self._oleobj_.InvokeTypes(0xa, LCID, 1, (9, 0), (),)
if ret is not None: ret = win32com.client.Dispatch(ret, 'LastErrorRecord', '{000C1093-0000-0000-C000-000000000046}',
UnicodeToString=0)
return ret
-------------
Here's how I'm working around it
-------------
import shutil
import win32com.client
import win32com.client.gencache
template_installer_name = 'EmptyInstaller.msi'
project_installer_name = 'test.msi'
shutil.copy(template_installer_name, project_installer_name)
wininst =
win32com.client.gencache.GetModuleForProgID("WindowsInstaller.Installer")
o = win32com.client.Dispatch("WindowsInstaller.Installer")
db = o.OpenDatabase(project_installer_name,
win32com.client.constants.msiOpenDatabaseModeTransact)
query_str = "select from Directory where DefaultDir = 'SourceDir' and Directory_Parent = ''"
try:
view = db.OpenView(query_str)
except:
error = o.LastErrorRecord
error = wininst.Record(error)
for field_num in range(1, error.FieldCount + 1):
print error.StringData(field_num)
More information about the Python-list
mailing list