I am experimenting with comtypes
and ArcObjects under Python 2.6.5 and ArcGIS 10 SP1. I'm using the pure Python method to wrap the ArcObjects OLBs described in this answer, but getting an error in the comtypes.CoCreateInstance
method.
Here is the code I am running:
def WrapModules():
#force wrapping of all ArcObjects libraries (OLBs)
import os
import comtypes.client
# change com_dir to whatever it is for you
com_dir = r'C:\Program Files\ArcGIS\Desktop10.0\com'
coms = [os.path.join(com_dir, x) for x in os.listdir(com_dir) if os.path.splitext(x)[1].upper() == '.OLB']
map(comtypes.client.GetModule, coms)
def GetApp():
"""Get a hook into the current session of ArcMap"""
from comtypes.gen import esriFramework
pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
if pAppROT is not None:
iCount = pAppROT.Count
if iCount == 0:
print 'No ArcGIS application currently running. Terminating ...'
return None
for i in range(iCount):
pApp = pAppROT.Item(i) #returns IApplication on AppRef
if pApp.Name == 'ArcMap':
print "ArcMap found"
return pApp
print 'No ArcMap session is running at this time.'
print "No AppROT found"
return None
def NewObj(MyClass, MyInterface):
"""Creates a new comtypes POINTER object where\n\
MyClass is the class to be instantiated,\n\
MyInterface is the interface to be assigned"""
from comtypes.client import CreateObject
import traceback
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
print traceback.format_exc()
return None
if __name__ == "__main__":
WrapModules()
pApp = GetApp()
if pApp is not None:
print "HWND: %d" % pApp.hWnd
else:
print "No ArcGIS application found!"
And here is the output from the script:
Traceback (most recent call last): File "C:\temp\ComHelpers.py", line 35, in NewObj ptr = CreateObject(MyClass, interface=MyInterface) File "C:\Python26\ArcGIS10.0\lib\site-packages\comtypes\client\__init__.py", line 235, in CreateObject obj = comtypes.CoCreateInstance(clsid, clsctx=clsctx, interface=interface) File "C:\Python26\ArcGIS10.0\lib\site-packages\comtypes\__init__.py", line 1145, in CoCreateInstance _ole32.CoCreateInstance(byref(clsid), punkouter, clsctx, byref(iid), byref(p)) File "_ctypes/callproc.c", line 925, in GetResult WindowsError: [Error -2147221231] ClassFactory cannot supply requested class No AppROT found No ArcGIS application found!