Встраивание MS Word в окно своего приложения

Тема в разделе "WASM.WIN32", создана пользователем WishMaster, 20 июн 2008.

  1. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Доброе время суток!
    Когда то давно помню читал где-то, как можно встроить приложение Word в свое приложение таким образом, чтобы Word открывался не отдельным окном-приложением, а загружался бы в заданном объекте (только какой это объект?) своего приложения. Но сейчас уже все забыл :) Кто-нибудь с таким сталкивался? Как можно сделать так, чтобы Word открылся именно в заданной области моего приложения? Управление им (запуск сервера, открытие документов и т.п.) - не вопрос.
    Заранее благодарен за советы.
     
  2. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Я писал что-то подобное на платформе .NET он использовал COM классы worda
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ActiveX?
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    А рискните SetParent
     
  5. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Какой?
    С удовольствием :) Это как?
     
  6. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    >>А рискните SetParent
    >С удовольствием :) Это как?

    Ну, приблизительно в таком неправедном духе (там надо кнопочку нажать):
     
  7. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  8. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Спасибо, архив скачал. Распаковался правда только екзешник (неожиданный конец архива). Мне действительно надо что то подобное, но я программирую на C++ Builder. Там можно поступить так, как это сделали Вы?

    Думаю мне действительно нужен ОЛЕ контейнер. Будем искать :)
    Спасибо за советы.
     
  9. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    kero
    ОЛЕ контейнером что то не очень доволен, мне не нравится, что там меню и кнопочная панель при запуске интегрируются в соответсвующие элементы приложения. Как делали вы? Там был ОЛЕ контейнер?

    И еще - если я использую последний, то как мне получить указатель на Ворд, открывшийся в ОЛЕ контейнере? Если я создаю Ворд отдельно, напрямую:
    Код (Text):
    1. Variant WordServ = Variant::CreateObject("Word.Application");
    то такой вопрос, понятно, не постает. А как в случае с ОЛЕ конейнером, когда я создаю Ворд так:
    Код (Text):
    1. OleContainer->CreateObject("Word.Document", false);
     
  10. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Есть какие то мысли?
     
  11. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  12. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    WishMaster
    Надо сделать импорт ActiveX-компонента MS Word (Кажись в меню это называется Components|Import ActiveX), чтобы он "завернулся" в компонент Билдера. И бросить этот компонент на форму.
     
  13. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    kero

    Выложите, плз, исходник, а то Ваш архив битый...
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Да нет, архив не битый (проверил заново и ИЁ-м, и РеГетом), это что-то с вашими настройками, т.к. теперь и с рарами на васме что-то не то (см. ветку "Аттач" в форуме Васм-Сайт).

    А "битым" можно назвать предложенный мной (в шутку и в учебных целях :) ) способ "просто через SetParent": для таких монстров, как WinWord, последствия вылезают быстро.
    Или попробуйте воспроизвести "удочерение" скринсэйвера, как на закладке "Заставка" на панели "Свойства: Экран".

    А исходничек - вот он весь целиком:
    Код (Text):
    1. .386
    2. .model  flat,stdcall
    3. option  casemap:none
    4.  
    5. include  \masm32\include\windows.inc
    6. include  \masm32\include\user32.inc
    7. include  \masm32\include\kernel32.inc
    8. include  \masm32\include\shell32.inc
    9. includelib \masm32\lib\user32.lib
    10. includelib \masm32\lib\kernel32.lib
    11. includelib \masm32\lib\shell32.lib
    12.  
    13. .const
    14.   id     equ  100
    15. .data
    16.   _WW     db "WINWORD.EXE",0
    17.   _OA     db "OpusApp",0
    18.   _btn    db "button",0  
    19. .data?
    20.   oldproc dd ?
    21.   msg     MSG <>
    22. .code
    23.  
    24. WndProc proc uses ebx hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    25.   .if uMsg==WM_DESTROY
    26.     invoke PostQuitMessage,0
    27.     xor eax,eax
    28.   .elseif uMsg==WM_COMMAND && wParam==id
    29.       invoke    ShellExecute,0,0,offset _WW,0,0,SW_HIDE ;
    30.       cmp   eax,33
    31.       jae @f
    32.       invoke MessageBox,0,offset _OA,0,40000h
    33.       ret
    34. @@:
    35.       invoke Sleep,10
    36.       invoke FindWindow,offset _OA,0
    37.       test eax,eax
    38.       jz @b
    39.       mov ebx,eax
    40.     invoke SetParent,ebx,hWnd
    41.       invoke SetWindowPos,ebx,0,20,40,300,300,SWP_NOZORDER OR SWP_FRAMECHANGED OR SWP_SHOWWINDOW
    42.     xor eax,eax
    43.   .else
    44.     invoke CallWindowProc,oldproc,hWnd,uMsg,wParam,lParam
    45.   .endif
    46.   ret
    47. WndProc endp   
    48.  
    49. start:
    50.   invoke GetModuleHandle,0
    51.   push eax
    52.   invoke CreateWindowEx,WS_EX_TOPMOST OR WS_EX_CLIENTEDGE,offset _btn,0,WS_OVERLAPPEDWINDOW OR WS_VISIBLE OR WS_CLIPCHILDREN OR BS_OWNERDRAW,10,10,400,400,0,0,eax,0
    53.   push eax
    54.   invoke SetWindowLong,eax,GWL_WNDPROC,offset WndProc
    55.   mov oldproc,eax
    56.   pop eax
    57.   pop ecx
    58.   invoke CreateWindowEx,0,offset _btn,0,WS_CHILD OR WS_VISIBLE,4,4,20,20,eax,id,ecx,0
    59.   .while TRUE
    60.     invoke GetMessage,addr msg,0,0,0
    61.     .break .if (!eax)
    62.     invoke TranslateMessage,addr msg
    63.     invoke DispatchMessage,addr msg
    64.   .endw
    65.     invoke  ExitProcess,msg.wParam
    66. end start
     
  15. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  16. lamerkz666

    lamerkz666 New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2008
    Сообщения:
    10
    ваще!
     
  17. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  18. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    temp666, lamerkz666
    Спасибо, ништяк!
    Хотя Undocumented EditBox покруче будет :)
     
  19. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    kero

    Спасибо, будем изучать.

    P.S. Черти со всех сторон окружили со своим 666
     
  20. Valentin

    Valentin Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    128
    kero

    Попробовал ЕКСЕЛЬ запустить в свое окно.
    Все нормально, НО: при закрытии родительского окна не разрушается дочернее (ЕКСЕЛЬ), выдается ошибка.
    С ВОРДОМ все норально.
    Ваши соображения ???