2

Visual Studio 2010 アドインを開発していますが、現時点では行き詰まっています。特定のプロジェクト アイテムのプロパティ変更に関する通知を受け取りたいです。たとえば、新しいフォーム (winform) がプロジェクトに追加されたかどうかを知る必要があります。

Visual Studio 2010 でフォームをプロジェクトに追加する方法は 2 つあります。

  1. コンテキスト メニューから新しいフォーム アイテムを簡単に追加できます。この場合、ProjectItemAddedイベントが IDE によってスローされます。問題は、その時点で新しいフォームがeFileTypeCppHeaderではなくeFileTypeCppFormとして認識されることです。

  2. 2 番目のオプションは、ヘッダー ファイルの FileType プロパティを[プロパティ] タブで " C++ Form " に変更することです。このプロパティの変更についてアドインに通知するイベントはありません。

では、アドインは ProjectItem のプロパティが変更されたことをどのように知ることができるのでしょうか?

4

1 に答える 1

1

最後に、プロジェクトのプロパティ変更イベントにバインドする方法を見つけました。IVsHierarchyインターフェイスを実装してから、OnPropertyChangedイベントを実装する必要があります。また、開いているプロジェクトを列挙し、それらのプロパティの変更を 1 つずつバインドする必要があります。以下の例を参照してください。

public ref class Hierarchy: public IVsHierarchyEvents
{
private:
    IVsHierarchy^ TargetHierarchy;
    unsigned int TargetHierarchyCookie;

public:
    Hierarchy(IVsHierarchy^ THierarchy)
    {
        TargetHierarchy = THierarchy;
        TargetHierarchy->AdviseHierarchyEvents(this, TargetHierarchyCookie);
    }

    virtual int OnPropertyChanged(unsigned int itemid, int propid, unsigned int flags)
    {
        // your code here
    }

    ...
};




public ref class Connect : public IDTExtensibility2, public IDTCommandTarget
{
private:
    List<Hierarchy^>^ Hierarchies;

    ...

public:
    virtual void OnConnection(...)
    {
        appObject = dynamic_cast<DTE2^>(Application);
        addInInstance = dynamic_cast<AddIn^>(AddInInst);

        ...

        // obtain the service provider
        OLE::Interop::IServiceProvider^ SProvider = safe_cast<OLE::Interop::IServiceProvider^>(appObject);
        Guid Sol_GuidService = (Guid)(SVsSolution::typeid)->GUID;
        Guid Sol_riid = (Guid)(SVsSolution::typeid)->GUID;
        IntPtr Sol_ppvObject;

        // obtain the solution object
        if (SProvider->QueryService(Sol_GuidService, Sol_riid, Sol_ppvObject)==VSConstants::S_OK && IntPtr::Zero!=Sol_ppvObject)
        {
            IVsSolution^ Sol = safe_cast<IVsSolution^>(Marshal::GetObjectForIUnknown(Sol_ppvObject));
            IEnumHierarchies^ EnumHierarchies = nullptr;
            Guid ProjectGUID = Guid("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}");

            // enumerate through the projects and bind the project changed events
            if (Sol->GetProjectEnum((unsigned int)(__VSENUMPROJFLAGS::EPF_MATCHTYPE | __VSENUMPROJFLAGS::EPF_ALLPROJECTS), ProjectGUID, EnumHierarchies)==VSConstants::S_OK && EnumHierarchies!=nullptr)
            {
                UInt32 pceltFetched;
                array<IVsHierarchy^>^ rgelt = gcnew array<IVsHierarchy^>(1){nullptr};
                for (EnumHierarchies->Reset(); EnumHierarchies->Next(1, rgelt, pceltFetched)==VSConstants::S_OK && pceltFetched==1; )
                {
                    Hierarchy^ NewHierarchy = gcnew Hierarchy(rgelt[0]);
                    Hierarchies->Add(NewHierarchy);                         
                }
            }
        }           
    }

    ...
};
于 2013-03-17T12:07:00.497 に答える