Debuging VC++( COM ) -> C#( COM Interop )
От: Herclia США  
Дата: 24.02.05 18:24
Оценка:
Уважаемые !
Вопрос в следующем:
На ToolBar в IE есть новая созданная кнопка,
реализация этой кнопки — VC++(COM)(Visual Studio 6).
При нажатии на кнопку вызывается библиотека на C#,
оформленная как (COM Interop), Visual Studio 2003,
все прекрасно работает.
Встал вопрос отладки, Gaidar(gotdotnet.ru) подсказал
как эту связку дебагировать.
Что сделал:
1. Menu:Project->Properties->Configuration Properties->
Debuggin->Start Action->Debug Mode->(выставил)
'Wait to Attach to External Process'.
2. Menu:Debug->Process->Internet Explorer(необходимый процесс)
->Attach->Close, выделил: Common Language Runtime и Native.

Начинаем отладку: Нажимаю кнопку на toolbar в IE вылетает
диалоговое окно со следующей информацией:

"Microsoft Development Environment has encountered a
problem and need to close...",
"Restart Microsoft Development Environment ?"

Это странно еще и потому, что если просто нажимаешь,
на кнопку в IE без 'Debug mode'(attach process),
вылетает MessageBox, с сообщением, "C#/COM Interop alive",
что и ожидалось, другими словами все нормально работает.
Где грабли ?

Код C#/COM Interop:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyKeyFile("vpDownload.snk")]


namespace vpDownload
{
    // Guid for the interface IDownload.
    [GuidAttribute("002C1649-2C18-452d-858B-387A831E9246"),InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
    public interface IDownload
    {
        [DispId(1)]
        int _initPanel( long _hwndIE, long _hwndParent );
    }

    // Guid for the coclass CoDownload.
    [Guid("95503DFF-8C1C-4c73-90D7-AFF0C0C42995")]
    public class CoDownload : IDownload
    {
        public CoDownload() {}

        public int _initPanel( long _hwndIE, long _hwndParent )
        {
            MessageBox.Show( "C#/COM Interop alive !" );
            return 0;
        }
    }
}


Код VC++(COM) клиент, функция вызова:

STDMETHODIMP Exec( const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut )    
{
    IDownload* pntIDownload = NULL;

    // create download object.
    CLSID CLSID_vpDownload;
    if( FAILED( CLSIDFromProgID( L"vpDownload.CoDownload", &CLSID_vpDownload ))) 
       return E_FAIL;
    
    if( FAILED( CoCreateInstance( CLSID_vpDownload, 0, CLSCTX_ALL, __uuidof(IDownload), ( void** )&pntIDownload ))) 
       return E_FAIL;

    // intit download object(test).
    long retValue = 0;
    int  paramOne = 1;
    int  paramTwo = 2;
    pntIDownload->_initPanel(( long ) paramOne, ( long ) paramTwo, &retValue );

    return S_OK;
}
Re: Debuging VC++( COM ) -> C#( COM Interop )
От: EM Великобритания  
Дата: 24.02.05 18:59
Оценка:
попробуй не аттачиться, а позвать


Diagnostics.Debugger.Break();
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: Debuging VC++( COM ) -> C#( COM Interop )
От: Herclia США  
Дата: 24.02.05 21:00
Оценка:
Уважаемый ЕМ, не совсем понял, что имеется ввиду, под

Diagnostics.Debugger.Break();


Первый мой порыв был, как в visual Studio 6.0, там есть
возможность задать стартовую задачу для дебаггера —
'Executable for debug session'.

По аналогии пошел в опции проекта: 'Debug mode' поменял на URL,
в 'start url' поставил 'about:blank'. Запустил задачу(F5) поднялся IE,
на его toolbar(е) нажал кнопку. Далее появляется MessageBox, с сообщением:
"C#/COM Interop alive !" , но в функцию _initPanel(),
break point не зашел. T.e. модуль отрaботал без дебаггера !!!
Re[3]: Debuging VC++( COM ) -> C#( COM Interop )
От: EM Великобритания  
Дата: 25.02.05 11:08
Оценка:
Здравствуйте, Herclia, Вы писали:


H>Уважаемый ЕМ, не совсем понял, что имеется ввиду, под


H>
H>Diagnostics.Debugger.Break();
H>



Я предлагал не аттачить студию, а вписать вышеизложенную мысль вместо брекпоинта — студия должна приаттачиться автоматически
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[4]: Debuging VC++( COM ) -> C#( COM Interop )
От: Herclia США  
Дата: 25.02.05 18:47
Оценка:
Уважаемый ЕМ !

public int _initPanel( long _hwndIE, long _hwndParent )
{
    System.Diagnostics.Debugger.Break();

    MessageBox.Show( "IDownload run..." );
    return 0;
}

Запускаем IE, нажимем кнопку на tool bar.

В появившемся диалоге выбираем:
vpDownload — Microsoft C#.NET[design] — Download.cs: Visual Studio.NET 2003,
в следующем диалоге выбираем:
CLR, Native -> OK...

Вылетает сообщение:
Unable to attach to the process.

Что то не так сделал ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.