【发布时间】:2019-12-11 06:42:19
【问题描述】:
我有一个实用程序 (grep),它给我一个文件名列表和一个行号。在我确定 devenv 是打开文件的正确程序后,我想确保它在指定的行号处打开。在 emacs 中,这将是:
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"
我认为使用多个“/Command”参数可能会做到这一点,但我可能没有正确的参数,因为我要么收到错误,要么根本没有响应(除了打开一个空的 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”来调用它?
-
不,这只是用现有 devenv 实例打开文件的代码。这个想法是,如果我必须有专门的代码来打开文件,这就是那个代码。对不起,我之前没有回复你,我才注意到你的评论。
-
我想知道截至 VS 2010 是否有人有更清洁的方法来做到这一点?
标签: visual-studio command-line