Программно вставить OLE в окно. Как?

Тема в разделе "WASM.WIN32", создана пользователем kkrutoy, 17 дек 2007.

  1. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    Как вставить OLE объект в окно, чтоб можно было его активировать и взаимодействовать с ним?
    Например, как мне расположить в окне IE-шный IWebBrowser2?
    CreateWindowEx - тут не обойдешься. Какой интерфейс/объект нужно создать?
     
  2. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    тут уже проскакивала тема... пользуйся поиском
     
  3. iceaxe

    iceaxe New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    14
    Привет, меня этот вопрос тоже интересовал.
    Мне повезло наткнуться на интересный исходничек на Си (чистом), я перевел его на асм, ну и добавил кое-что.
    Если интересно, пиши на мыло box_of_iceaxe@mail.ru, обязательно вышлю исходники.
     
  4. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    Для тех, кому интересно, расскажу, чего накопал, а то ненавижу, когда меня посылают нагугл.

    Есть такие ATL функции (Active template library).

    AtlAxCreateControl() - создает OLE контрол по GUID или по ProgID, втыкает его в окно и возвращает интерфейс объекта. Сам еще не пробовал, но говорят, что работает.

    iceaxe, у тебя тоже и этой оперы исходники?
     
  5. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
  6. iceaxe

    iceaxe New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    14
    Нет, товарищ kkrutoy, мне попался исходник на чистом Си, я перевел его на Асм и немного добавил функций. Исходник назывался (ну и щас называется :)) CWebPage.
     
  7. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    katrus, чтоб его скачать надо региться. Мне впадлу. Тем более библиотечка...

    iceaxe, что такое "на чистом Си"? Какой еще бывает? Ты имеешь в виду без MFC?

    Суть такая, чтобы создать окно, нужно сделать CreateWidnow. Чтоб создать контрол, нужно получить его интерфейс и связать с нашим окном, или заставить самому создать окно и привязать к главной форме. Больше, видимо, никак...

    Не нужно примеров и исходников (которых еще хер скачаешь), просто напиши пару функций "на чистом Си". Остальное сам найду. Или вставь текст исходника. Всяко полезнее будет, чем "...у меня где-то был..."
     
  8. iceaxe

    iceaxe New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    14
    Уважаемый kkrutoy!

    1. Да, чистый Си бывает. Когда так говорят, имеют ввиду без использования MFC и ATL, только Win API.
    2. Чел, я понял суть, ибо сам когда-то искал подобную информацию.
    3. Если тебе не нужно примеров и исходников, то что же тебе тогда надо? Тебе сильно поможет если я напишу: "Используй OleInitialize, OleCreate, OleSetContainedObject, OleUninitialize и силу, Люк"?
    4. Текст исходника достаточно большой, много комментариев на хэппи инглиш. Мой вариант на асме тоже не маленький. Вставлять не буду.
    5. Где ты видел у меня фразу "...у меня где-то был..."? Он у меня не где-то, а в рабочей папке, всегда под рукой.

    Короче, предлагаю то, что нашел я. Не хочешь - не бери. Я ему, блин, от чистого сердца, чтоб не мучался, не искал.

    Давно бы уже скачал (я ж тебе не гигабайт предлагаю скачать) и разбирался, а то какой-то тупой перепиской занимаемся!
     
  9. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    Как раз-то поможет. В MSDN много информации, но поиск в ней отстойный. На каком-то форуме (ссылку на который мне предоставил кто-то любящий всех посылать нагугл) написано, что ATL - единственный способ. Я то знаю, что ATL - это обертки, поэтому и прошу выложить небольшой фрагмент кода. Например:

    OleInitialize
    ....
    CreateWindow
    ....
    OleUninitialize

    Этого будет достаточно. И, товарисч, будто некуда выложить файло с прямой ссылкой. Это придется на каждом форуме по каждой ссылке региться, а мне ихний спам нафиг неусрался.
     
  10. iceaxe

    iceaxe New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    14
    Не могу прикрепить файл, почему-то :dntknw:

    Подскажи как, вроде в ответе выбираю, хрень какая-то...
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  12. iceaxe

    iceaxe New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    14
    Во, точно этот исходник, а я блин ссылку потерял.
     
  13. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    Немного модифицировал исходник для нормального C++ (это там, где интерфейсы поддерживаются).
    Архивчег выложу, если получится. Но вот основная процедурка. Там еще добавил код, как загрузить в броузер не страничку, а просто данные из переменной.

    Код (Text):
    1. void CreateBrowser(HWND hWnd)
    2. {
    3.     // Нужно при всех манипуляциях с OLE
    4.     OleInitialize(NULL);
    5.  
    6.     // IStorage требуется для создания объекта. Нам он нафиг не нужен,
    7.     // поэтому почти все его методы возвращают E_NOTIMPL
    8.     IMyStorage *Storage = new IMyStorage;
    9.  
    10.     // IOleClientSite - основной интерфейс для внедрения. Нам нужна только его функция QueryInterface
    11.     // для выдачи интерфейса IOleInPlaceSite
    12.     IMyOleClientSite *OleClientSite = new IMyOleClientSite;
    13.  
    14.     // IOleInPlaceSite - интерфейс для получения контролом окна, в которое ему нужно вставиться
    15.     IMyOleInPlaceSite *OleInPlaceSite = new IMyOleInPlaceSite;
    16.  
    17.     OleClientSite->OleInPlaceSite = OleInPlaceSite;
    18.     OleInPlaceSite->window = hWnd;
    19.    
    20.     // Нужен нам для того, чтобы дать контролу команду к отображению себя
    21.     IOleObject *OleObject;
    22.            
    23.     OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, 0, (LPOLECLIENTSITE)OleClientSite, (LPSTORAGE)Storage, (LPVOID*)&OleObject);
    24.    
    25.     // Нужен для сообщения контролу, что он является содержимым.
    26.     IUnknown *Unknown;
    27.  
    28.     OleObject->QueryInterface(IID_IUnknown, (LPVOID*)&Unknown);
    29.     OleSetContainedObject((LPUNKNOWN)Unknown, TRUE);
    30.  
    31.     RECT rect;
    32.     GetClientRect(hWnd, &rect);
    33.  
    34.     // Растягиваем контрол на всю ширину окна
    35.     OleObject->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite*)OleClientSite, 0, hWnd, &rect);
    36.     //ole->SetHostNames(L"App", L"Obj");
    37.        
    38.     // Нужен для манипуляций с контролом (панели инструментов, HTML содержимое и т.д.)
    39.     IWebBrowser2 *WebBrowser;
    40.  
    41.     OleObject->QueryInterface(IID_IWebBrowser2, (LPVOID*)&WebBrowser);
    42.    
    43.              // Загружаем в броузер HTML из переменной. Для этого нужно сначала открыть страницу about:blank
    44.  
    45.     // Строки в OLE передаются в типе VARIANT
    46.     VARIANT Url;
    47.     BSTR UrlStr = SysAllocString(L"about:blank");
    48.     Url.vt = VT_BSTR;
    49.     Url.bstrVal = UrlStr;
    50.  
    51.     // Открываем страницу
    52.     WebBrowser->Navigate2(&Url, 0, 0, 0, 0);
    53.  
    54.     SysFreeString(UrlStr);
    55.  
    56.     IDispatch *Dispatch;
    57.  
    58.     //Нужен для непосредственной загрузки данных в броузер
    59.     IPersistStreamInit *Init;
    60.  
    61.     // Прокладка для IPersistStreamInit
    62.     IStream *Stream;
    63.  
    64.     WebBrowser->get_Document(&Dispatch);
    65.     Dispatch->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&Init);
    66.  
    67.     // Выделим памяти для строки с HTML
    68.     HGLOBAL hStr = GlobalAlloc(GMEM_FIXED | GMEM_DISCARDABLE, 255);
    69.  
    70.     // Копируем в память HTML код
    71.     memcpy(hStr,"<HTML><B>BIG TEXT</B></HTML>", 28);
    72.  
    73.     // Создаем временный IStream
    74.     CreateStreamOnHGlobal(hStr, TRUE, &Stream);
    75.  
    76.     // Загружаем в броузер наш HTML
    77.     Init->Load((LPSTREAM)Stream);
    78.  
    79.     GlobalFree(hGlobal);
    80.  
    81.     return;
    82. }