Thursday 25 August 2016

Python, comtypes and ArcObjects: Error creating AppROT object


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!

Thanks for any insights you might have!



Answer



Import arcpy first, you aren't doing any license checkout or setting up the ArcObjects 10.0 runtime as-is so it won't find the CoClass.



No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...