Уважаемые !
Вопрос в следующем:
На 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;
}
попробуй не аттачиться, а позвать
Diagnostics.Debugger.Break();
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Уважаемый ЕМ, не совсем понял, что имеется ввиду, под
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ботал без дебаггера !!!
Здравствуйте, Herclia, Вы писали:
H>Уважаемый ЕМ, не совсем понял, что имеется ввиду, под
H>H>Diagnostics.Debugger.Break();
H>
Я предлагал не аттачить студию, а вписать вышеизложенную мысль вместо брекпоинта — студия должна приаттачиться автоматически
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Уважаемый ЕМ !
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.
Что то не так сделал ?