1

J'ai a nice tidy way of capturing unhandled exceptions que j'affirme à mes utilisateurs et (éventuellement) recevoir par e-mail à moi-même. Ils regardent généralement quelque chose comme ceci:Comment puis-je lancer Visual Studio par programme et l'envoyer vers un fichier/une ligne spécifique?

Uncaught exception encountered in MyApp (Version 1.1.0)! 

Exception: 
    Object reference not set to an instance of an object. 
Exception type: 
    System.NullReferenceException 
Source: 
    MyApp 
Stack trace: 
    at SomeLibrary.DoMoreStuff() in c:\projects\myapp\somelibrary.h:line 509 
    at SomeAlgothim.DoStuff() in c:\projects\myapp\somealgorithm.h:line 519 
    at MyApp.MainForm.ItemCheckedEventHandler(Object sender, ItemCheckedEventArgs e) in c:\projects\myapp\mainform.cpp:line 106 
    at System.Windows.Forms.ListView.OnItemChecked(ItemCheckedEventArgs e) 
    at System.Windows.Forms.ListView.WmReflectNotify(Message& m) 
    at System.Windows.Forms.ListView.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

Est-il possible de lancer Visual Studio et ont ouvert c:\projects\myapp\somelibrary.h sur la ligne incriminée et si oui, comment?

Je voudrais aussi le faire à partir de l'email (html) que je génère si c'est possible?

+0

Je suis sûr qu'il ya des trucs d'automatisation que vous pouvez utiliser, ou même une macro, mais je ne sais pas comment. – leppie

+0

Vous feriez mieux de l'essayer dans un cadre de déploiement réaliste. Vous n'aurez pas les numéros de ligne. –

+0

@Hans Passant: il peut lui-même envoyer lui-même la trace de la pile et montrer à l'utilisateur un message amical. – egrunin

Répondre

4

Vous pouvez automatiser Visual Studio, en utilisant par exemple VBScript:

filename = Wscript.Arguments(0) 
lineNo = Wscript.Arguments(1) 

' Creates an instance of the Visual Studio IDE. 
Set dte = CreateObject("VisualStudio.DTE") 

' Make it visible and keep it open after we finish this script. 
dte.MainWindow.Visible = True 
dte.UserControl = True 

' Open file and move to specified line. 
dte.ItemOperations.OpenFile(filename) 
dte.ActiveDocument.Selection.GotoLine (lineNo) 

Enregistrer ce que dire debugger.vbs et l'exécuter, en passant le nom du fichier et la ligne n ° comme args de ligne de commande:

debugger.vbs c:\dev\my_file.cpp 42 
1

depuis votre question est étiquetée C++, voici du code dans ce langage pour y parvenir; fondamentalement le même principe que la réponse de jon, mais plus de texte ..

bool OpenFileInVisualStudio(const char* psFile, const unsigned nLine) 
{ 
    CLSID clsid; 
    if(FAILED(::CLSIDFromProgID(L"VisualStudio.DTE", &clsid))) 
    return false; 

    CComPtr<IUnknown> punk; 
    if(FAILED(::GetActiveObject(clsid, NULL, &punk))) 
    return false; 

    CComPtr<EnvDTE::_DTE> DTE = punk; 
    CComPtr<EnvDTE::ItemOperations> item_ops; 
    if(FAILED(DTE->get_ItemOperations(&item_ops))) 
    return false; 

    CComBSTR bstrFileName(psFile); 
    CComBSTR bstrKind(EnvDTE::vsViewKindTextView); 
    CComPtr<EnvDTE::Window> window; 
    if(FAILED(item_ops->OpenFile(bstrFileName, bstrKind, &window))) 
    return false; 

    CComPtr<EnvDTE::Document> doc; 
    if(FAILED(DTE->get_ActiveDocument(&doc))) 
    return false; 

    CComPtr<IDispatch> selection_dispatch; 
    if(FAILED(doc->get_Selection(&selection_dispatch))) 
    return false; 

    CComPtr<EnvDTE::TextSelection> selection; 
    if(FAILED(selection_dispatch->QueryInterface(&selection))) 
    return false; 

    return !FAILED(selection->GotoLine(Line, TRUE))); 
} 
Questions connexes