我有一个实用程序(grep),它提供了一个文件名列表和一个行号。在确定devenv是打开文件的正确程序之后,我想确保它在指定的行号处打开。在emacs,这将是:在Visual Studio中打开一个特定行号的文件
emacs +140 filename.c
我没有发现这样的Visual Studio(devenv)。我找到的最接近的是:
devenv /Command "Edit.Goto 140" filename.c
但是,这会为每个这样的文件创建一个单独的devenv实例。我宁愿有一些使用现有实例的东西。
这些变化重新使用现有的devenv的,但是不要去指定的路线:
devenv /Command "Edit.Goto 140" /Edit filename.c
devenv /Command /Edit filename.c "Edit.Goto 140"
我认为使用多个“/命令”参数可能做到这一点,但我可能不有正确的一个,因为我得到错误或根本没有回应(除了打开一个空的devenv)。
我可以为devenv编写一个特殊的宏,但是我希望这个工具可以被没有这个宏的其他人使用。我不清楚如何使用“/ Command”选项调用该宏。
任何想法?
好吧,似乎没有办法做到这一点,因为我想。由于看起来我需要专用代码来启动Visual Studio,因此我决定使用EnvDTE,如下所示。希望这会帮助别人。
#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;
}
太棒了。那么,你是否用“devenv/command Macros.MyMacros.visual_studio_open_file myFile someLineNumber”来调用它? – EndangeredMassa 2008-12-12 14:55:38
不,这只是用devenv的现有实例打开文件的代码。这个想法是,如果我必须有专门的代码来打开文件,这就是代码。 对不起,我以前没有回复你,我刚刚注意到你的评论。 – 2008-12-17 17:00:05
我想知道是否有人有更清晰的方式来做到这一点VS 2010? – 2010-08-24 20:52:27