J'ai un utilitaire grep () qui me donne une liste de noms de fichiers et les numéros de ligne. Après j'ai déterminé que devenv est le bon programme pour ouvrir un fichier, je voudrais vous assurer qu'il est ouvert à l'indication du numéro de la ligne. Dans emacs, ce serait:
emacs +140 filename.c
Je n'ai rien trouvé de ce genre pour Visual Studio (devenv). Le plus proche que j'ai trouvé est:
devenv /Command "Edit.Goto 140" filename.c
Cependant, ce qui rend une instance distincte de devenv pour chaque fichier. Je préfère avoir quelque chose qui utilise une instance existante.
Ces variations de ré-utiliser un existant devenv, mais ne pas aller à la ligne indiquée:
devenv /Command "Edit.Goto 140" /Edit filename.c
devenv /Command /Edit filename.c "Edit.Goto 140"
Je pensais que l'utilisation de plusieurs "/Commande" arguments pourraient le faire, mais je n'ai probablement pas la bonne parce que je l'ai, des erreurs ou absence de réponse à tous les (autres que l'ouverture d'un vide devenv).
Je pourrais écrire une macro spécial pour devenv, mais je voudrais à cet outil d'être utilisés par ceux qui n'ont pas de macro. Et je ne suis pas clair sur la façon d'appeler cette macro avec le "/Commande" option.
Des idées?
Eh bien, il ne semble pas qu'il y est un moyen de faire ce que je voulais. Depuis qu'il regarde comme je vais avoir besoin d'avoir consacré du code de démarrage de Visual Studio, j'ai décidé d'utiliser EnvDTE comme indiqué ci-dessous. J'espère que cela va aider quelqu'un d'autre.
#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;
}