0

注意:问题最初是关于 Python 和win32com的,但事实证明问题存在于 COM 服务器中,而不是客户端。因此,问题和答案中的信息适用于所有可用作 COM 客户端的语言。

也许有人可以帮忙。我面临的是以下情况。我可以用我的代码实例化VisualStudio.VCProjectEngine.8.0就好了。相关代码:

import win32com
vcver = {
         'VisualStudio.VCProjectEngine.8.0' : ('{FBBF3C60-2428-11D7-8BF6-00B0D03DAA06}', 0, 8, 0),
         'VisualStudio.VCProjectEngine.10.0' : ('{0CD36BB6-D828-4DB9-91BF-AD493EE76B79}', 0, 10, 0),
         }
for ProgID, vc in vcver.iteritems():
    # Error also happens without the following line
    win32com.client.gencache.EnsureModule(vc[0], vc[1], vc[2], vc[3])
    o = win32com.client.gencache.GetClassForProgID(ProgID)()
    if o:
        try:
            # The following line causes the exception ...
            o.CreateProject('test')
            print "Success for %s" % ProgID
        except Exception as e:
            print str(e)
            raise

...给出了这个错误:

Success for VisualStudio.VCProjectEngine.8.0
(-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)
Traceback (most recent call last):
  File "D:\scriptname.py", line 123, in <module>
    o.CreateProject('test')
  File "C:\Users\Username\AppData\Local\Temp\gen_py\2.7\0CD36BB6-D828-4DB9-91BF-AD493EE76B79x0x10x0.py", line 2756, in CreateProject
    ret = self._oleobj_.InvokeTypes(213, LCID, 1, (9, 0), ((8, 1),),projectName
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)

如您所见,一个工作正常,另一个神秘地失败了。是什么赋予了?


这是makepy.py -i给出的:

>makepy.py -i VisualStudio.VCProjectEngine.8.0
VCProjectEngineLibrary
 {FBBF3C60-2428-11D7-8BF6-00B0D03DAA06}, lcid=0, major=8, minor=0
 >>> # Use these commands in Python code to auto generate .py support
 >>> from win32com.client import gencache
 >>> gencache.EnsureModule('{FBBF3C60-2428-11D7-8BF6-00B0D03DAA06}', 0, 8, 0)

>makepy.py -i VisualStudio.VCProjectEngine.10.0
VCProjectEngineLibrary
 {0CD36BB6-D828-4DB9-91BF-AD493EE76B79}, lcid=0, major=10, minor=0
 >>> # Use these commands in Python code to auto generate .py support
 >>> from win32com.client import gencache
 >>> gencache.EnsureModule('{0CD36BB6-D828-4DB9-91BF-AD493EE76B79}', 0, 10, 0)

注意:我刚刚注意到由匹配给出的 CLSIDmakepy.py -i匹配VisualStudio.VCProjectEngine.8.0,但不匹配VisualStudio.VCProjectEngine.10.0(注册表显示的位置{4547a58d-fc1c-4502-84fa-0163ee766635}):

注册表中 VisualStudio.VCProjectEngine.10.0 的 CLSID

但是,即使将元组调整为VisualStudio.VCProjectEngine.10.0to('{4547a58d-fc1c-4502-84fa-0163ee766635}', 0, 10, 0)也无济于事。


该错误似乎与 Visual Studio 2010 及更高版本有关。我还尝试使用 给定VisualStudio.VCProjectEngine.11.0VisualStudio.VCProjectEngine.12.0值作为 ProgID makepy.py -i,但错误相似:

Error for VisualStudio.VCProjectEngine.11.0: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)
Error for VisualStudio.VCProjectEngine.10.0: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)
Error for VisualStudio.VCProjectEngine.12.0: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u'One or more errors occurred.', None, 0, -2146233088), None)
4

1 回答 1

1

TL;WR(太长不会读)

要点是,微软VisualStudio.VCProjectEngine从 Visual Studio 2010 开始悄悄地改变了自动化接口的语义,并且在官方文档中几乎没有提及这一事实。相反,似乎希望开发人员收集 MSFT 员工在 MS Connect 和论坛页面上留下的花絮,并以有意义的方式将它们连接起来。


哇,所以微软决定改变 how 的语义VCProjectEngine。相比:

评论内容如下:

您无法实例化独立VCProjectEngine对象,因为必须在包含应用程序的文件夹中部署其他二进制文件。相反,VCProjectEngine从已在 Visual Studio 中打开的项目中获取对象。

不幸的是,微软似乎已经决定使用旧接口创建新项目是不合法的,即更改接口的语义。

这篇文章试图收集和连接可用的信息——官方文档中没有这些信息。

雪上加霜的是,该文档的文档最终在所述接口的文档底部出现了微不足道的评论。

如果您想要更好的解释……或者更确切地说是花絮……请进行网络搜索。也许你能想出比我发现的更好的东西。我想出的是这里的声明强调我的):

从 Visual Studio 2010 开始,不再支持此 API。有关如何以编程方式访问项目的更多信息,请参阅此链接:http: //blogs.msdn.com/b/visualstudio/archive/2010/01/15/how-to-read-write-the-new-visual -c-project-properties.aspx

很“有趣”的是,这些重要信息没有进入官方文档。因此,按照上面的链接,我们得到的只是对 VS 2010 之前存在的基础知识的解释,暗示不支持 API 仅在引用的 MS Connect 案例中提到。

这个 MS Connect 案例提到设置环境变量 ( VisualStudioVersion=11.0),但不出所料,这也无济于事。此外,对各自的 Visual Studio 版本使用VS201x 的开发人员命令提示也不会产生任何结果。又一个死胡同。

另一个 MS 论坛主题似乎也很相关:Opening .vcxproj files in the VS2010 and this one:VS 2010 C++ VCProjectEngine failure? .

引用后者的相关部分:

原因

实际上,找不到路径的错误与 .vcxproj 文件的路径无关。此错误代码是由于内部尝试在(实际上是正在运行的可执行文件的路径)ProjectComponents下查找文件夹而 冒出来的。InstallPath

解析度

我刚刚复制了Microsoft Visual Studio 10.0\Common7\Tools\ProjectComponents构建我的测试应用程序的 Debug 文件夹下的文件夹,它不再失败。具体来说,它正在寻找的文件夹来自一个组成的字符串(在 C# 中),如下所示:

Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "ProjectComponents")

一位开发人员建议我可能“......还需要将此目录添加到应用程序配置文件中的程序集探测路径中。” 但是我能够让它运行简单的测试而不这样做。其他项目引擎操作可能需要它。

漫长的旅程终于结束了吗?不是这样......试图在 Visual Studio 安装中找到这个神秘的文件夹会产生......好吧,什么都没有。

C:\>for %i in (10.0 11.0 12.0) do dir "%ProgramFiles(x86)%\Microsoft Visual Studio %i\Common7\IDE\ProjectComponents"

...给出(剥离的冗余信息):

C:\>dir "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ProjectComponents"
 Directory of C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
File Not Found
C:\>dir "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectComponents"
 Directory of C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE
File Not Found
C:\>dir "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ProjectComponents"
 Directory of C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
File Not Found

因此,所谓的解决方法所需的文件夹在(全部?)Visual Studio 安装中不存在。


旁注:{4547a58d-fc1c-4502-84fa-0163ee766635}我发现的神秘 CLSID 解析为Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProjectEngineShimkey 下的名称HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{4547a58d-fc1c-4502-84fa-0163ee766635}。所以我想实际的东西被一个不能很好地完成工作的垫片所取代。

于 2013-12-31T14:14:00.037 回答