https://github.com/jondy/imessagefilter
A python package implements interface IMessageFilter for COM
https://github.com/jondy/imessagefilter
com imessagefilter
Last synced: 3 months ago
JSON representation
A python package implements interface IMessageFilter for COM
- Host: GitHub
- URL: https://github.com/jondy/imessagefilter
- Owner: jondy
- License: mit
- Created: 2019-03-16T22:27:35.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2020-02-09T10:24:08.000Z (about 6 years ago)
- Last Synced: 2025-09-28T06:06:12.443Z (7 months ago)
- Topics: com, imessagefilter
- Language: C
- Size: 12.7 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.rst
- License: LICENSE
Awesome Lists containing this project
README
=================
IMessageFilter
=================
A python package implements interface IMessageFilter for COM.
The main purpose is to fix 'Application is Busy' and 'Call was Rejected By Callee' errors in a WINDOWS COM/COM+ client.
Here is a workaround
https://docs.microsoft.com/en-us/previous-versions/ms228772(v=vs.140)
But it's written by C#, this package offers both C and Python versions.
Usage
-----
Install it::
pip install imessagefilter
Import `CMessageFilter` from `imessagefilter`
Call static method `register` at the beginning of automation
Call static method `revoke` at the end of work
Here it's an example:
.. code:: python
from comtypes.client import CreateObject
from imessagefilter import CMessageFilter
def iter_excel_sheets(filename):
CMessageFilter.register()
aobj = CreateObject('Excel.Application', dynamic=True)
aobj.Workbooks.Open(filename)
for sheet in aobj.ActiveWorkbook.Worksheets:
print('Processing %s' % sheet.Name)
CMessageFilter.revoke()
.. note::
The interface `IMessageFilter` only works in single-threaded
apartments, it will not be called in the multithreaded
apartments.
Refer to
https://docs.microsoft.com/en-us/windows/desktop/com/choosing-the-threading-model
Build `msgfilter.dll`
---------------------
By visual studio command line::
cl /LD msgfilter.c ole32.lib
By mingw32 in cygwin::
i686-pc-mingw32-gcc -shared -o msgfilter.dll msgfilter.c -lole32 -luuid
There are 2 export functions, they can be used in any c file.
Here it's an exmaple:
.. code:: c
#include
#include
extern void register_message_filter();
extern void revoke_message_filter();
int main(int argc, char* argv[])
{
HRESULT ret;
ret = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
register_message_filter();
// do something for automation
revoke_message_filter();
CoUninitialize();
return 0;
}
Change Logs
-----------
0.2.1
~~~~~
* Search msgfilter.dll in the current path first
0.1.3
~~~~~
* Fix no long description in package information
0.1.2
~~~~~
* Fix typos