Python,comtypes和ArcObjects:创建AppROT对象时出错

Python, comtypes and ArcObjects: Error creating AppROT object

我在python 2.6.5和arcgis 10 sp1下试验comtypes和arcObjects。我使用纯python方法来包装这个答案中描述的arcObjects olbs,但是在comtypes.CoCreateInstance方法中得到了一个错误。

下面是我运行的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
\
    MyClass is the class to be instantiated,
\
    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!"

下面是脚本的输出:

1
2
3
4
5
6
7
8
9
10
11
12
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!

感谢您的洞察力!


为了完整起见,Jason Scheirer在GIS堆栈交换上发布了此解决方案:

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.