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)

makepy.py -i注: で指定された CLSID が に一致するVisualStudio.VCProjectEngine.8.0が、VisualStudio.VCProjectEngine.10.0(レジストリに が表示されている場合{4547a58d-fc1c-4502-84fa-0163ee766635})には一致しないことに気付きました。

レジストリ内の VisualStudio.VCProjectEngine.10.0 の CLSID

ただし、タプルを調整してもVisualStudio.VCProjectEngine.10.0('{4547a58d-fc1c-4502-84fa-0163ee766635}', 0, 10, 0)例外には役立ちません。


このエラーは、Visual Studio 2010 以降で発生しているようです。によって与えられた値で ProgID としてVisualStudio.VCProjectEngine.11.0も試しましたが、エラーは同様でした:VisualStudio.VCProjectEngine.12.0makepy.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 (長い間読めません)

要点は、Microsoft が Visual Studio 2010 から自動化インターフェイスのセマンティクスを静かに変更VisualStudio.VCProjectEngineし、公式ドキュメントでその事実についてほとんど言及していないことです。代わりに、開発者は、MSFT の従業員が MS Connect とフォーラムのページ全体に残したちょっとした情報を収集し、意味のある方法でそれらを結び付けることが期待されているようです。


うわー、マイクロソフトは how のセマンティクスを変更することにしましたVCProjectEngine。比較:

コメントには次のように書かれています。

VCProjectEngineアプリケーションを含むフォルダに追加のバイナリをデプロイする必要があるため、スタンドアロン オブジェクトをインスタンス化することはできません。VCProjectEngine代わりに、 Visual Studio で開いたプロジェクトからオブジェクトを取得します。

残念ながら、Microsoft は、古いインターフェイスを使用して新しいプロジェクトを作成すること、つまりインターフェイスのセマンティクスを変更することは正当ではないと判断したようです。

この投稿は、入手可能な情報を収集して結び付けようとする試みであり、公式ドキュメントにはありません。

さらに侮辱を加えるために、これに関するドキュメントは、上記のインターフェイスのドキュメントの下部にあるわずかなコメントで終わります。

より良い説明が必要な場合は、またはちょっとした情報が必要な場合は、Web 検索を行ってください。おそらく、私が見つけたものよりも優れたものを思い付くことができます。私が思いついたのは、ここにあるこのステートメントです(強調は私のものです):

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 より前に存在していた基本事項の説明しか得られず、引用された MS Connect のケースでのみ言及されている API がサポートされていないことが示唆されます。

この MS Connect ケースでは、環境変数 ( VisualStudioVersion=11.0) の設定について言及していますが、当然のことながら、これも役に立ちません。また、それぞれの Visual Studio バージョンに対して VS201x の開発者コマンド プロンプトを使用しても結果は得られません。もう一つの行き止まり。

MS フォーラムの別のスレッドも関連しているようです: VS2010 で .vcxproj ファイルを開く: 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")

開発者の 1 人は、「...このディレクトリをアプリ構成ファイルのアセンブリ プローブ パスに追加する必要があるかもしれない」と提案しました。しかし、それをしなくても簡単なテストを実行することができました。他のプロジェクト エンジン操作で必要になる場合があります。

長い旅がついに終わる?そうではありません... 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 のインストールには存在しません。


補足: 私が見つけた謎の CLSIDは、 key の下の{4547a58d-fc1c-4502-84fa-0163ee766635}名前に解決されます。だから、現物はあまりうまく機能しないシムに置き換えられたと思います。Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProjectEngineShimHKEY_CLASSES_ROOT\Wow6432Node\CLSID\{4547a58d-fc1c-4502-84fa-0163ee766635}

于 2013-12-31T14:14:00.037 に答える