Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Проблема с Com из SDK 7.1


Автор: givis22 19.10.2010, 07:57
Захотелось написать небольшое приложение к таск бару для Windows 7. 
Взял SDK 7.1 от туда пример deskbands. Дописал нужный мне функционал.
При попытке запустить debug в VS2010 пишет приложение не может быть запущено D:\Coding_fxxx\deskbands\Win32\Debug\DeskbandSDKSample.dll

Из консоли выполняю D:\Coding_fxxx\deskbands\Win32\Debug\regsvr32.exe DeskbandSDKSample.dll. Сервис успешно стартует.
Все функции свои выполняет. (Отображает иконку на таск баре и обрабатывает клики мышкой).
Но проводник через 10-20 минут падает с такой ошибкой:

Сигнатура проблемы:
Имя события проблемы: BEX
Имя приложения: explorer.exe
Версия приложения: 6.1.7600.16450
Отметка времени приложения: 4aeba271
Имя модуля с ошибкой: DeskbandSDKSample.dll_unloaded
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 4cbbe91e
Смещение исключения: 10001950
Код исключения: c0000005
Данные исключения: 00000008
Версия ОС: 6.1.7600.2.0.0.256.48
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

В примере из sdk работал только с DeskBand.cpp. Поэтому прикрепляю его.
Подскажите новичку пожалуйста где искать проблему?


Автор: givis22 19.10.2010, 12:36
Все проблема решилась.. Окозалось проблема в SDK.. причем начиная с SDK 7.0 (в 7.1 не исправлено до сих пор). 
Вот на что нужно заменить (конструктор и деструктор)
Описание из за чего это происходит 
The DLL is getting unloaded due to DllCanUnloadNow saying there are no outstanding references – there are though, so once the DLL is unloaded, the WndProc of the deskband window is still called and that causes the crash. The fix is to have the CDeskBand class increment and decrement references to the global DLL reference count – that will cause DllCanUnloadNow to prevent the deskband DLL from being unloaded when a deskband exists.
Код

extern long         g_cDllRef;
extern HINSTANCE    g_hInst;
extern CLSID CLSID_DeskBandSample;
static const WCHAR g_szDeskBandSampleClass[] = L"DeskBandSampleClass";

CDeskBand::CDeskBand() :

    m_cRef(1), m_pSite(NULL), m_fHasFocus(FALSE), m_fIsDirty(FALSE), m_dwBandID(0), m_hwnd(NULL), m_hwndParent(NULL)
{
    InterlockedIncrement(&g_cDllRef);
}
CDeskBand::~CDeskBand()

{
    if (m_pSite)

    {
        m_pSite->Release();
    }
    InterlockedDecrement(&g_cDllRef);
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)