Как вставить OLE объект в окно, чтоб можно было его активировать и взаимодействовать с ним? Например, как мне расположить в окне IE-шный IWebBrowser2? CreateWindowEx - тут не обойдешься. Какой интерфейс/объект нужно создать?
Привет, меня этот вопрос тоже интересовал. Мне повезло наткнуться на интересный исходничек на Си (чистом), я перевел его на асм, ну и добавил кое-что. Если интересно, пиши на мыло box_of_iceaxe@mail.ru, обязательно вышлю исходники.
Для тех, кому интересно, расскажу, чего накопал, а то ненавижу, когда меня посылают нагугл. Есть такие ATL функции (Active template library). AtlAxCreateControl() - создает OLE контрол по GUID или по ProgID, втыкает его в окно и возвращает интерфейс объекта. Сам еще не пробовал, но говорят, что работает. iceaxe, у тебя тоже и этой оперы исходники?
kkrutoy http://www.codeproject.com/KB/atl/HTMLControl.aspx Недавно нашел. Если слегка обработать напильником - супер библиотечка.
Нет, товарищ kkrutoy, мне попался исходник на чистом Си, я перевел его на Асм и немного добавил функций. Исходник назывался (ну и щас называется ) CWebPage.
katrus, чтоб его скачать надо региться. Мне впадлу. Тем более библиотечка... iceaxe, что такое "на чистом Си"? Какой еще бывает? Ты имеешь в виду без MFC? Суть такая, чтобы создать окно, нужно сделать CreateWidnow. Чтоб создать контрол, нужно получить его интерфейс и связать с нашим окном, или заставить самому создать окно и привязать к главной форме. Больше, видимо, никак... Не нужно примеров и исходников (которых еще хер скачаешь), просто напиши пару функций "на чистом Си". Остальное сам найду. Или вставь текст исходника. Всяко полезнее будет, чем "...у меня где-то был..."
Уважаемый kkrutoy! 1. Да, чистый Си бывает. Когда так говорят, имеют ввиду без использования MFC и ATL, только Win API. 2. Чел, я понял суть, ибо сам когда-то искал подобную информацию. 3. Если тебе не нужно примеров и исходников, то что же тебе тогда надо? Тебе сильно поможет если я напишу: "Используй OleInitialize, OleCreate, OleSetContainedObject, OleUninitialize и силу, Люк"? 4. Текст исходника достаточно большой, много комментариев на хэппи инглиш. Мой вариант на асме тоже не маленький. Вставлять не буду. 5. Где ты видел у меня фразу "...у меня где-то был..."? Он у меня не где-то, а в рабочей папке, всегда под рукой. Короче, предлагаю то, что нашел я. Не хочешь - не бери. Я ему, блин, от чистого сердца, чтоб не мучался, не искал. Давно бы уже скачал (я ж тебе не гигабайт предлагаю скачать) и разбирался, а то какой-то тупой перепиской занимаемся!
Как раз-то поможет. В MSDN много информации, но поиск в ней отстойный. На каком-то форуме (ссылку на который мне предоставил кто-то любящий всех посылать нагугл) написано, что ATL - единственный способ. Я то знаю, что ATL - это обертки, поэтому и прошу выложить небольшой фрагмент кода. Например: OleInitialize .... CreateWindow .... OleUninitialize Этого будет достаточно. И, товарисч, будто некуда выложить файло с прямой ссылкой. Это придется на каждом форуме по каждой ссылке региться, а мне ихний спам нафиг неусрался.
Немного модифицировал исходник для нормального C++ (это там, где интерфейсы поддерживаются). Архивчег выложу, если получится. Но вот основная процедурка. Там еще добавил код, как загрузить в броузер не страничку, а просто данные из переменной. Код (Text): void CreateBrowser(HWND hWnd) { // Нужно при всех манипуляциях с OLE OleInitialize(NULL); // IStorage требуется для создания объекта. Нам он нафиг не нужен, // поэтому почти все его методы возвращают E_NOTIMPL IMyStorage *Storage = new IMyStorage; // IOleClientSite - основной интерфейс для внедрения. Нам нужна только его функция QueryInterface // для выдачи интерфейса IOleInPlaceSite IMyOleClientSite *OleClientSite = new IMyOleClientSite; // IOleInPlaceSite - интерфейс для получения контролом окна, в которое ему нужно вставиться IMyOleInPlaceSite *OleInPlaceSite = new IMyOleInPlaceSite; OleClientSite->OleInPlaceSite = OleInPlaceSite; OleInPlaceSite->window = hWnd; // Нужен нам для того, чтобы дать контролу команду к отображению себя IOleObject *OleObject; OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, 0, (LPOLECLIENTSITE)OleClientSite, (LPSTORAGE)Storage, (LPVOID*)&OleObject); // Нужен для сообщения контролу, что он является содержимым. IUnknown *Unknown; OleObject->QueryInterface(IID_IUnknown, (LPVOID*)&Unknown); OleSetContainedObject((LPUNKNOWN)Unknown, TRUE); RECT rect; GetClientRect(hWnd, &rect); // Растягиваем контрол на всю ширину окна OleObject->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite*)OleClientSite, 0, hWnd, &rect); //ole->SetHostNames(L"App", L"Obj"); // Нужен для манипуляций с контролом (панели инструментов, HTML содержимое и т.д.) IWebBrowser2 *WebBrowser; OleObject->QueryInterface(IID_IWebBrowser2, (LPVOID*)&WebBrowser); // Загружаем в броузер HTML из переменной. Для этого нужно сначала открыть страницу about:blank // Строки в OLE передаются в типе VARIANT VARIANT Url; BSTR UrlStr = SysAllocString(L"about:blank"); Url.vt = VT_BSTR; Url.bstrVal = UrlStr; // Открываем страницу WebBrowser->Navigate2(&Url, 0, 0, 0, 0); SysFreeString(UrlStr); IDispatch *Dispatch; //Нужен для непосредственной загрузки данных в броузер IPersistStreamInit *Init; // Прокладка для IPersistStreamInit IStream *Stream; WebBrowser->get_Document(&Dispatch); Dispatch->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&Init); // Выделим памяти для строки с HTML HGLOBAL hStr = GlobalAlloc(GMEM_FIXED | GMEM_DISCARDABLE, 255); // Копируем в память HTML код memcpy(hStr,"<HTML><B>BIG TEXT</B></HTML>", 28); // Создаем временный IStream CreateStreamOnHGlobal(hStr, TRUE, &Stream); // Загружаем в броузер наш HTML Init->Load((LPSTREAM)Stream); GlobalFree(hGlobal); return; }