Title: Support more of MSI api
Type: enhancement Stage:
Components: Library (Lib), Windows Versions: Python 3.5
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: loewis, markm, steve.dower, terry.reedy, tim.golden, zach.ware
Priority: normal Keywords: patch

Created on 2011-05-07 04:50 by markm, last changed 2015-02-24 21:21 by BreamoreBoy.

File name Uploaded Description Edit
expose_msi.c_handles.diff markm, 2011-05-07 04:50 _msi.c and msilib.rst patch to make msobj->h visible as "handle" review
Messages (5)
msg135401 - (view) Author: Mark Mc Mahon (markm) * Date: 2011-05-07 04:50
My main use case for msilib is for working with/editing existing MSI files and not creating MSI files.

As such I find much of the MSI API that I need missing.

While not difficult to re-create _msi.c with ctypes, I thought it might be good to use as much of _msi.c as implemented (faster :) )

The patch exposes the 'h' member of msiobj as 'handle', and updates the doc to refer to them.

There are no tests in the patch yet. Any recommendation on tests? (just check that the member exists and has an 'int' value?
msg135490 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2011-05-07 17:39
What's the purpose of the patch? I.e. what can you do when you have the handle exposed?
msg135519 - (view) Author: Mark Mc Mahon (markm) * Date: 2011-05-08 08:28
You can pass it to any function in the MSI SDK through ctypes.


    def ReadStream(record, field):
        buf = (ctypes.c_char * 2048)()
        orig_size = ctypes.sizeof(buf)
        status = 0
        res = []
        while status == 0:
            size = ctypes.c_long(ctypes.sizeof(buf))
            status = msidll.MsiRecordReadStream(
                record.hanlde, field, ctypes.byref(buf), ctypes.byref(size))
            if size.value != orig_size:
        data = "".join(res)
        return data

or any of the other functions not currently implemented in _msi.c
Some of the other important ones (to me at least) are:
 - MsiDatabaseGetPrimaryKeys
 - MsiDatabaseExport
 - MsiDatabaseImport

If the whole MSI SDK is wrapped - then exposing the handles would have no use :).

The alternative I have so far is to re-write _msi.c using ctypes (already done), but I thought it would be better if not all of _msi.c had to be re-implemented.

One alternative patch is to include those extra functions in _msi.c (though I am not sure I have the C skills to achieve that easily - and it may still miss functionality, and it may have even less chance of being accepted)
msg135565 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2011-05-09 05:46
I'd rather expose the missing functions, than supporting a mix of this module with a ctypes one; this patch sounds hackish.
msg135674 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2011-05-10 01:49
Your title mixes a goal -- exposing more of the MSI api -- with a particular means -- exposing an object that is only useful with ctypes. So I have taken the liberty of removing the implementation limitation. While clever, I do not believe that strategy has any precedent in the stdlib. While the stdlib includes ctypes, it does not use it to implement functions. While your proposal does not directly use ctypes, it does indirectly, by proxy (the user). So I think wider discussion, perhaps on pydev or python-idea, to see where the proposal falls with respect to current policy, before it could be approved. A special feature of msilib is that it is Windows only, where ctypes *should* always be available (though even that is not guaranteed if there is no maintenance, which there mostly is not at present).

Martin's suggestion is the traditional path. I have 0 knowledge of MSI API. How many new functions are we talking about? 10? 100?
Date User Action Args
2015-02-24 21:21:12BreamoreBoysetnosy: + tim.golden, zach.ware, steve.dower

components: + Windows
versions: + Python 3.5, - Python 3.3
2011-05-10 01:49:49terry.reedysetnosy: + terry.reedy

messages: + msg135674
title: Support more of MSI api by exposing handles -> Support more of MSI api
2011-05-09 05:46:56loewissetmessages: + msg135565
2011-05-08 08:28:50markmsetmessages: + msg135519
2011-05-07 17:39:43loewissetmessages: + msg135490
2011-05-07 04:50:24markmcreate