Ich habe ein Dienstprogramm (Grep), die mir eine Liste von Dateinamen und Zeilennummern gibt. Nachdem ich festgestellt habe, dass devenv das richtige Programm zum Öffnen einer Datei ist, möchte ich sicherstellen, dass es unter der angegebenen Zeilennummer geöffnet ist. In emacs wäre dies:Öffnen Sie eine Datei in Visual Studio unter einer bestimmten Zeilennummer
Ich habe nichts dergleichen für Visual Studio (Devenv) gefunden. Die nächstgelegene ich gefunden habe, ist:
devenv /Command "Edit.Goto 140" filename.c
Dies macht jedoch eine separate Instanz von devenv für jede solche Datei. Ich hätte lieber etwas, das eine existierende Instanz benutzt.
Diese Variationen wiederverwenden eine bestehende devenv, aber gehen Sie nicht auf die angegebene Zeile:
devenv /Command "Edit.Goto 140" /Edit filename.c
devenv /Command /Edit filename.c "Edit.Goto 140"
Ich dachte, dass mehrere „/ Command“ Argumenten es tun könnte, aber ich wahrscheinlich nicht habe den richtigen, weil ich entweder Fehler oder gar keine Antwort bekomme (außer das Öffnen eines leeren Devenv).
Ich könnte ein spezielles Makro für Devenv schreiben, aber ich möchte dieses Dienstprogramm von anderen verwendet werden, die dieses Makro nicht haben. Und ich bin nicht klar, wie man dieses Makro mit der Option "/ Command" aufrufen kann.
Irgendwelche Ideen?
Nun, es scheint nicht, dass es einen Weg gibt, dies zu tun, wie ich wollte. Da es so aussieht, dass ich zum Starten von Visual Studio dedizierten Code benötigen muss, habe ich beschlossen, EnvDTE wie unten gezeigt zu verwenden. Hoffentlich hilft das jemand anderem.
#include "stdafx.h"
//-----------------------------------------------------------------------
// This code is blatently stolen from http://benbuck.com/archives/13
//
// This is from the blog of somebody called "BenBuck" for which there
// seems to be no information.
//-----------------------------------------------------------------------
// import EnvDTE
#pragma warning(disable : 4278)
#pragma warning(disable : 4146)
#import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
#pragma warning(default : 4146)
#pragma warning(default : 4278)
bool visual_studio_open_file(char const *filename, unsigned int line)
{
HRESULT result;
CLSID clsid;
result = ::CLSIDFromProgID(L"VisualStudio.DTE", &clsid);
if (FAILED(result))
return false;
CComPtr<IUnknown> punk;
result = ::GetActiveObject(clsid, NULL, &punk);
if (FAILED(result))
return false;
CComPtr<EnvDTE::_DTE> DTE;
DTE = punk;
CComPtr<EnvDTE::ItemOperations> item_ops;
result = DTE->get_ItemOperations(&item_ops);
if (FAILED(result))
return false;
CComBSTR bstrFileName(filename);
CComBSTR bstrKind(EnvDTE::vsViewKindTextView);
CComPtr<EnvDTE::Window> window;
result = item_ops->OpenFile(bstrFileName, bstrKind, &window);
if (FAILED(result))
return false;
CComPtr<EnvDTE::Document> doc;
result = DTE->get_ActiveDocument(&doc);
if (FAILED(result))
return false;
CComPtr<IDispatch> selection_dispatch;
result = doc->get_Selection(&selection_dispatch);
if (FAILED(result))
return false;
CComPtr<EnvDTE::TextSelection> selection;
result = selection_dispatch->QueryInterface(&selection);
if (FAILED(result))
return false;
result = selection->GotoLine(line, TRUE);
if (FAILED(result))
return false;
return true;
}
Ehrfürchtig. Also, rufen Sie dies mit "devenv/command Macros.MyMacros.visual_studio_open_file myFile someLineNumber" auf? – EndangeredMassa
Nein, dies ist nur Code, um eine Datei mit einer vorhandenen Devenv-Instanz zu öffnen. Die Idee ist, dass, wenn ich spezialisierten Code haben muss, um die Datei zu öffnen, das ist dieser Code. Entschuldigung, ich habe mich vorher nicht bei Ihnen gemeldet, ich habe gerade Ihren Kommentar bemerkt. –
Ich frage mich, ob jemand eine sauberere Möglichkeit hat, dies ab VS 2010 zu tun? –