I have been putting together a presentation on how to use VSIP from automation (and vice-versa), and one bit of code that I have is how to call a VSIP interface from a macro. To make the VSIP calls, you need to first install the VSIP Extras SDK available from the vsipdev.com web site. Next, within the directory you installed into, copy the interop assemblies (IAs) into the {VS Install Directory}\Common7\IDE\PublicAssemblies folder. This is necessary to make the assemblies available. To your macro projects. Next, open the macros IDE, choose a project, right click the References node, and add a reference to the Microsoft.VisualStudio.* assemblies. After doing this, you are ready to call VSIP interfaces. The following code demonstrates this by retrieving the application name and showing it in a message box:


Sub ShowAppName()

    Dim sp As Microsoft.VisualStudio.OLE.Interop.IServiceProvider

    Dim vsuishell As Microsoft.VisualStudio.Shell.Interop.IVsUIShell

    Dim guid1 As System.Guid

    Dim guid2 As System.Guid

    Dim ip As System.IntPtr

    Dim appName As String


    sp = DTE

    guid1 = GetType(Microsoft.VisualStudio.Shell.Interop.SVsUIShell).GUID

    guid2 = GetType(Microsoft.VisualStudio.Shell.Interop.IVsUIShell).GUID

    sp.QueryService(guid1, guid2, ip)

    vsuishell = System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(ip)



End Sub


This could be more readable with a function to retrieve a service in a more generic way, but I will leave that up to you to exercise your programming skills.


One word of caution: some methods and interfaces are marked local in the idl from which the IAs were generated. While this bit of information does not transfer to the IAs, when you try to call those methods or interfaces, they will fail. This is because the Macros IDE runs in a separate process from VS, and making these cross-process calls will fail because you cannot remote GDI objects (HICONs, HBITMAPs, etc.).