не могу создать диалог с activex
От: assad Россия  
Дата: 12.02.10 08:34
Оценка:
Пишу shellextension как это описано в статье http://www.rsdn.ru/?article/winshell/shlext5.xml
Автор(ы): Michael Dunn
Дата: 15.08.2001

Расширение оболочки для добавления новых страниц в набор свойств файлов
с одним изменением -- добавил activex контрол на диалог.
Диалог не создается. (Без activeX создается)
addPages завершается без ошибок.
в PropPageDlgProc приходит сообщение WM_SETFONT а потом сразу WM_DESTROY.
Сообщений об ошибках нигде нет.

Вопрос1: что я делаю не так?

проинициализировать апартаменты пробовал. CoInitializeEx(0,0) и OleInitialize(0); (ставил эти строчки в PropPageCallbackProc и PropPageDlgProc)
хотя понятно что это и не должно было как-то повлиять

для исследования можно попытаться создать вручную контрол при инициализации диалога.
Вопрос2: как это сделать?
CreateWindowEx("GuidControl'a")?

HRESULT SimpleShlExt::AddPages(LPFNADDPROPSHEETPAGE add_page_proc, LPARAM param)
{ 
  PROPSHEETPAGE psp;
  psp.dwSize  = sizeof(psp);
  psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE | PSP_DEFAULT | PSP_USECALLBACK;
  psp.hInstance = GetModuleInstance();
  psp.pszTemplate = MAKEINTRESOURCE(IDD_FILETIME_PROPPAGE);
  psp.pszTitle = "yyy";
  psp.pfnDlgProc = PropPageDlgProc;
  psp.lParam = (LPARAM)_tcsdup("xxx");
  psp.pfnCallback = PropPageCallbackProc;
  psp.pcRefParent = GetRefParent();

  HPROPSHEETPAGE h_page = CreatePropertySheetPage(&psp);
  if (h_page != 0)
  {
    if (!add_page_proc(h_page, param))
    {
      DestroyPropertySheetPage(h_page);
    }
  }
  return S_OK;
}

UINT CALLBACK PropPageCallbackProc(HWND hwnd, UINT msg, LPPROPSHEETPAGE ppsp)
{
 return 1;
}

INT_PTR CALLBACK PropPageDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
  return FALSE;
}
activex shellextension dialog
Re: не могу создать диалог с activex
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.02.10 10:25
Оценка:
Здравствуйте, assad, Вы писали:

A>Пишу shellextension как это описано в статье http://www.rsdn.ru/?article/winshell/shlext5.xml
Автор(ы): Michael Dunn
Дата: 15.08.2001

A>Расширение оболочки для добавления новых страниц в набор свойств файлов с одним изменением -- добавил activex контрол на диалог.
A>Диалог не создается. (Без activeX создается) addPages завершается без ошибок.

А вызов InitCommonControlsEx есть?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: не могу создать диалог с activex
От: algol Россия about:blank
Дата: 12.02.10 10:29
Оценка: 13 (2)
Здравствуйте, assad, Вы писали:

A>Пишу shellextension как это описано в статье http://www.rsdn.ru/?article/winshell/shlext5.xml
Автор(ы): Michael Dunn
Дата: 15.08.2001


Т.е., как я понял, пишете на чистом WinAPI без ATL и MFC?

A>с одним изменением -- добавил activex контрол на диалог.


Каким образом его добавили? Положили на диалог в ресурсах? Но WinAPI про ActiveX ничего не знает, это работает только для ATL и MFC, где соответствующий класс (например CAxDialog в ATL) парсит ресурс диалога и сам создает контрол.
Вам нужно самостоятельно создавать контрол в диалоге. Способы создания ActiveX контролов в любом приложении описаны здесь:
How to add ATL control containment support to any window in Visual C++
How to add ActiveX controls to an ATL composite control programmatically in Visual C++ ("These techniques can also be used to dynamically create ActiveX controls on any window.")

A>Диалог не создается. (Без activeX создается)


Возможно, вам будет проще сделать Shell Extension на ATL/WTL. CAxPropertyPage в WTL содержит поддержку ActiveX в диалоге.
Сам ShellExtension можно быстро сделать визардом типа этого — PropertySheet Shell Extension AppWizard.
А этот визард может помочь при создании классов из диалоговых ресурсов — Creating a WTL Dialog, Property Sheet or Wizard out of a resource (The Easy Way).
Re[2]: не могу создать диалог с activex
От: assad Россия  
Дата: 12.02.10 11:15
Оценка:
спасибо это помогло.

CAxWindow wnd;
wnd.Attach(hwnd);
HRESULT hr = wnd.CreateControlEx(_T("{DF16845C-92CD-4AAB-A982-EB9840E74669}"));

это то что надо было.
самое интересное что так контрол создается. а из ресурсов напрямую нет.
Шелл екстеншен я делаю на atl.
Re[2]: не могу создать диалог с activex
От: assad Россия  
Дата: 12.02.10 11:19
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>А вызов InitCommonControlsEx есть?

Да. его наличие и отчутвие ничего не меняет.
Re[3]: не могу создать диалог с activex
От: assad Россия  
Дата: 12.02.10 11:21
Оценка:
Здравствуйте, assad, Вы писали:

контрол создается, но не каждый раз показывается.
Re[3]: не могу создать диалог с activex
От: algol Россия about:blank
Дата: 12.02.10 11:42
Оценка:
Здравствуйте, assad, Вы писали:

A>Шелл екстеншен я делаю на atl.


Если вы используете CPropertyPage, то возможно замена на CAxPropertyPage решит проблему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.