返回首页

{A}
{S0}演示

这篇文章应该让你开始一个WTL(或其他原生Win32)的应用程序集成到OpenOffice.org电源。 预览
首先,您需要下载并安装OpenOffice.org 3.0从,如果尚未完成。
接下来,从{A6}提取的WtlOOo.exe应用到任何合适的位置,并运行它。尝试打开你手边的任何Microsoft Office文件,并检查打印和打印预览能力,以及保存到PDF功能。
这些功能,内置的OOo的被称为使用{A7}类通过一个简单的WTL的命令处理程序。

class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,

                   public CMessageFilter, public CIdleHandler

{

//...

        COOoCtrl m_view;



//...

        BEGIN_MSG_MAP(CMainFrame)

//...

                COMMAND_ID_HANDLER(ID_FILE_SAVE, OnSaveToPDF)



//...

        LRESULT OnSaveToPDF(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/,

                BOOL& /*bHandled*/)

        {

                m_view.ExecuteId(ID_OOo_PDF);

                return 0;

        }

//...
准备OOo的SDK
使用UNO API访问OOo的功能,在您的应用程序,你应该去通过以下步骤:下载并安装OOO 3.0 SDK中的一个LT; OOoSdkDirgt从{A8};开发站。在Vista系统中,避免安装在C:\ Program Files或任何其他的UAC保护的文件夹。生成匹配您的OOo的安装OOo的SDK的C代码:摘录{A9} OOoCpp.js和OOo.vsprops LT; OOoSdkDirgt; \ SDK。运行OOoCpp.js。此脚本将创建一个LT; OOoSdkDirgt \ includecpp文件夹,用正确的参数运行的SDK cppumaker工具来填充这个文件夹匹配的UNO类型库types.rdb和offapi.rdb与C头; cppumaker坐落在LT; OOoSdkDirgt 〔\ bin和需要在LT位于OOo的DLL的; OOoInstallDirgt; \ URE \ BIN。 OOoInstallDirgt;源类型库在不同的文件夹下LT,所以这个脚本的方式,以避免许多挫折。
OOoCpp.js也将在OOo.vsprops更新,你LT的OOoSdkDir变量; OOoSdkDirgt;安装文件夹。
添加这个更新OOo.vsprops的​​属性设置为任何Win32项目在Visual工作室/ VCExpress 2005/2008足以在你的C项目中使用的OOo的SDK。
OOo.vsprops定义的宏WNT,设置正确的搜索路径和头文件和库的名称,并设置延迟加载sal3.dll,cppu3.dll,并cppuhelper3MSC.dll。因此,应用程序可以添加到它的运行路径在LT位于OOo的DLL的; OOoInstallDirgt; \ URE \ bin和注册表中发现,在实际调用之前,的。{C}编译WtlOOo.exe
WTLOOo.sln是一个VC2005 Express解决方案将升级如果打开VS2008的或VC2008快。你应该准备好,现在来编译它。
正如这篇文章是在WTL节,我认为您的Visual Studio / VCExpress 2005/2008编译器正确设置访问WTL的8.0。 {A10}和项目文件提取到您选择的LT; WtlOOoProjgt;文件夹。从LT更新OOo.vsprops; OOoSdkDirgt; \ SDK复制到LT; WtlOOoProjgt;
编译,运行,和享受。在WindowsTM工作与UNO API
这篇文章是不是有关UNO API的教程。咨询{A11}和相关的链接在这里使用的命名空间和类的文档。
{A12}代码分成两个命名空间:OOo的命名空间是纯粹的Win32代码,不需要ATL或WTL。它的辅助功能和两个类组成:OOO::DocWindow。OOO::TerminationMonitor。
的WTL::COOoCtrlTlt; GT;类需要OOo的命名空间代码,是基于对OOo的两个:DocWindow和ATL::CWindow的。OOo的功能UNO辅助功能:OOO:GetBootContext(,引导背景下的存取):获得一个COM:太阳:明星:UNO:XComponentContext通过:CPPU:引导()调用。OOO:GetComponentFactory(),主厂房的存取。OOO:实例(​​),UNO服务的存取帮手。 运行时的辅助函数:LRESULT OOO:FindInstallAndSetPath()增加了OOo的DLL的位置,如果在注册表中发现,应用程序的路径环境变量。
常量布尔OOO::IsAvailable()执行运行时连接测试:它调用FindInstallAndSetPath(),如果成功的话,调用GetBootContext(),从而连接到OOo的DLL的设置他们的访问路径后。
调用OOO::IsAvailable()在您的应用程序代码的开始是最好的方式触发的OOo的DLL的延迟加载。如果OOO:IsAvailable()返回false,你不能在这个运行时环境中使用OOO。COM::太阳:明星:UTIL:网址解析器:OOO使用许多描述符URL类的文件,不仅说明符:网址OOO:使用getURL(LPCWSTR sUrl)返回一个通用的COM:太阳:明星:UTIL:从LPCWSTR(例如,命令字符串作为quot; UNO。:ExportDirectToPDFquot;)的URL。网址OOO:GetPathURL(LPCWSTR SPATH)返回一个COM正确填写:太阳:明星:UTIL:从LPCWSTR的Win32路径名的URL。COM::太阳:明星::豆::PropertyValue和COM:太阳:明星:UNO:Sequencelt; COM:太阳:明星:豆类:PropertyValuegt;佣工:LT模板,typename的TGT; PropertyValue OOo的:PROPVAL(LPCWSTR SNAME,T t_Val)返回一个COM:太阳:PropertyValue:明星:豆:从LPCWSTR和任何类型的值。LT模板,typename的TGT; Sequencelt; PropertyValuegt; OOO::SeqPropVal(LPCWSTR SNAME,T t_Val)返回一个元素COM:太阳:明星:UNO:序列包含一个COM:太阳:明星:豆类: PropertyValuelt; TGT;命名SNAME。COM:太阳:明星:UNO::任何/ HWND的转换器:任何OOO:HWNDToAny(HWND HWND)和HWND的OOO:AnyToHWND(Anyamp;任何)
文件承载能力测试:
BOOL OOO::CanLoad(LPCWSTR SPATH)检查的Win32 SPATH命名的文件可以作为一个UNO文档加载。 OOO::TerminationMonitor
一个OOo的sOffice.exe单实例是一个系统上运行,用户可能最终退出菜单命令。只要一个OOO:TerminationMonitor对象是活着的,它可以防止用户或程序动作(卸载OOo的DLL和我们的应用程序崩溃)sOffice.exe终止。
默认构造函数:OOO::TerminationMonitor(BOOL bAllow = FALSE,BOOL bRegister = TRUE)设计,以防止在对象的生存期OOO终止。一个简单的TerminationMonitor默认实例将与sOffice.exe注册(bRegister = TRUE)和预防(bAllow = FALSE)用户终止。
if (OOo::IsAvailable())

{

    OOo::TerminationMonitor tm; // prevent user OOo termination ...

     

} // ...until here

在大多数情况下,这是不够的,如果你需要较小的细粒度操作构造未经注册后使用注册的布尔(BOOL bRegister)和bool AllowTermination(BOOL bAllow)成员。OOO:DocWindow:一个UNO文档窗口封装类
这个独立的类包装了OOo的窗口包含OOo的文档。它没有明确的构造函数和,作为唯一的(私人)数据成员是智能指针,没有明确的析构函数。窗口相关的成员是:BOOL OOO::DocWindow::创建(HWND hWndParent,LPCWSTR sFrameName = NULL,BOOL bVisible = TRUE)作为一个孩子的hWndParent创建一个UNO窗口,并把它插入在UNO架构。成功,则返回true,否则为false。HWND的OOO::DocWindow:GetHWND()返回的DocWindow的Win32 HWND,NULL,如果不创建。无效OOo的:DocWindow::SetWindowRect(RECTamp;正确)设置通过OOo的程序DocWindow上的立场。BOOL OOO::DocWindow::UIShow(LPCWSTR sURL,BOOL bShow)设置UI元素的可视性:sURL是视觉元素标识符像quot;私人:资源/菜单栏/ menubarquot。
该文件相关的成员是:
bool OOo::DocWindow::OpenDocument(URL& url, Sequence<PropertyValue>& sProperties)

sProperties PropertyValue请求的URL打开一个文件:例如,PROPVAL(Lquot; ReadOnlyquot;,TRUE)。
bool OOo::DocWindow::OpenNewDocument(LPCWSTR sName, bool bReadOnly = true)

准备一个空文档的URL一样quot,私营工厂/ scalcquot; SNAME和一个Sequencelt; PropertyValuegt;从PROPVAL(Lquot; ReadOnlyquot;,bReadOnly)之前调用OpenDocument格式(URLamp; Sequencelt; PropertyValuegt;放大器;)。
bool OOo::DocWindow::OpenFileDocument(LPCWSTR sPath, bool bReadOnly = true)

文件路径名不相同。
bool Ooo::DocWindow::CloseDocument()
bool OOo::DocWindow::HasDocument()
LPCWSTR Ooo::DocWindow::GetDocTitle()
bool OOo::DocWindow::ExecuteURL(URL& url, Sequence<PropertyValue>& sProperties, 

	Reference<XStatusListener> xListener = NULL)

执行命令的URL像quot; UNO:ExportDirectToPDFquot;中可以找到有效的命令名称{A13}。{A14} WTL::COOoCtrl:一个WTL的OOo的封装:DocWindow
这个非常简单的类派生从ATL::CWindow的OOO::DocWindow。
有些CWindow的成员被覆盖,以避免误操作:你可以不重视()或分离()COOoCtrl。
操作系统创建()成员呼吁OOO:DocWindow::create()方法,并成功套CWindow的:m_hWnd OOo的结果:DocWindow:GetHWND()。
其他的Create()成员呼吁这一个,而忽略参数。
WTL::COOoCtrl增加了两名成员及其父母,使资源字符串UI的知名度和执行命令的用法。
bool ExecuteId(UINT uIdOOoCmd)

{

    CTempBuffer<WCHAR> sCmd(64);

    AtlLoadString(uIdOOoCmd, sCmd, 64);

    return ExecuteURL(GetURL(sCmd), Sequence<PropertyValue>());

}



bool UIShowId(UINT uIdOOoUIPart, bool bShow)

{

    CTempBuffer<WCHAR> sUIPart(64);

    AtlLoadString(uIdOOoUIPart, sUIPart, 64);

    return UIShow(sUIPart, bShow);

}
WtlOOo用法的COOoCtrl
WtlOOo启动一个简单的(WTL的应用程序向导生成的)多线程SDI应用程序,使用的WTL::COOoCtrl可以查看。
命令和UI描述符字符串资源添加到WtlOOo.rc。
STRINGTABLE

BEGIN

    IDR_MAINFRAME           "WtlOOo"

    ID_OOo_PDF              ".uno:ExportDirectToPDF"

    ID_OOo_PRINT            ".uno:PrintDefault"

    ID_OOo_PRINT_PREVIEW    ".uno:PrintPreview"

    ID_OOo_UI_MENUBAR       "private:resource/menubar/menubar"

    ID_OOo_UI_STANDARDBAR   "private:resource/toolbar/standardbar"

END

运行消息循环之前,我们检查OOO:IsAvailable();如果为false,我们一个消息框,中止,否则,我们实例化一个OOO:TerminationMonitor和运行应用程序。
// WtlOOo.cpp : main source file for WtlOOo.exe

//...

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/,

      LPTSTR lpstrCmdLine, int nCmdShow)

{

//...

    // BLOCK: Run application

    if (OOo::IsAvailable())

    {

        OOo::TerminationMonitor tm;

        CWtlOOoThreadManager mgr;

        nRet = mgr.Run(lpstrCmdLine, nCmdShow);

    }

    else

        AtlMessageBox(NULL, L"OpenOffice.org 3 not found!", IDR_MAINFRAME,

                MB_OK | MB_ICONERROR);

//...

在CMainFrame中,我们声明一个COOoCtrl m_view成员。
// MainFrm.h : interface of the CMainFrame class

//

/////////////////////////////////////////////////////////////////////////////



#pragma once



class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,

        public CMessageFilter, public CIdleHandler

{

public:

    DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)



    COOoCtrl m_view;

我们完成消息映射。
BEGIN_MSG_MAP(CMainFrame)

    MESSAGE_HANDLER(WM_CREATE, OnCreate)

    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)

    COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)

    COMMAND_ID_HANDLER(ID_FILE_OPEN, OnFileOpen)

    COMMAND_ID_HANDLER(ID_FILE_NEW, OnNewWindow)

    COMMAND_RANGE_HANDLER(ID_NEW_WRITER, ID_NEW_WEBPAGE, OnNewDoc)

    COMMAND_ID_HANDLER(ID_FILE_SAVE, OnSaveToPDF)

    COMMAND_ID_HANDLER(ID_FILE_PRINT_PREVIEW, OnPrintPreview)

    COMMAND_ID_HANDLER(ID_FILE_PRINT, OnPrint)

    COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)

    COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)

    NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnMenuNew)

END_MSG_MAP()
打开文件和新文件处理
OnFileOpen()执行一个文件打开对话框,并检查OOO::CanLoad()选定的文件,OnNewDoc()建立新选定的文件的名称。
都在m_view开,只读取现有的文件,隐藏菜单和主工具栏(它们附加到文档,而不是到窗口),并更新窗口的标题。
载入一个新的文档将关闭当前,这样既恢复了以前存在的文件菜单和工具栏的可视性。
void ShowDocBars(bool bShow)

{

   if (m_view.HasDocument())

   {

      m_view.UIShowId(ID_OOo_UI_MENUBAR, bShow);

      m_view.UIShowId(ID_OOo_UI_STANDARDBAR, bShow);

   }

}



void UpdateTitle()

{

   static CString sApp(MAKEINTRESOURCE(IDR_MAINFRAME));

   CString sTitle;

   if (m_view.HasDocument())

      sTitle.Format(L"%s - %s", m_view.GetDocTitle(), sApp);

   else

      sTitle = sApp;

   SetWindowText(sTitle);

}



LRESULT OnNewDoc(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, 

    BOOL& /*bHandled*/)

{

   static CString sTitle = L"private:factory/";

   LPCWSTR names[] =

   {

      L"swriter", L"scalc", L"sdraw", L"simpress", L"swriter/web"

   };



   ShowDocBars(true);

   m_view.OpenNewDocument(sTitle + names[wID - ID_NEW_WRITER], false);

   ShowDocBars(false);

   UpdateTitle();

   return 0;

}



LRESULT OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, 

    BOOL& /*bHandled*/)

{

   CFileDialog dlg(TRUE);

   if (dlg.DoModal() == IDOK && OOo::CanLoad(dlg.m_szFileName))

   {

      CWaitCursor wc;

      ShowDocBars(true);

      m_view.OpenFileDocument(dlg.m_szFileName);

      ShowDocBars(false);

      UpdateTitle();

   }

   return 0;

}

的打印,打印预览,并保存命令处理的CMainFrame调用COOoCtrl:ExecuteId()与相应的命令字符串ID。
LRESULT OnSaveToPDF(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/,

     BOOL& /*bHandled*/)

{

    m_view.ExecuteId(ID_OOo_PDF);

    return 0;

}



LRESULT OnPrintPreview(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/,

     BOOL& /*bHandled*/)

{

    m_view.ExecuteId(ID_OOo_PRINT_PREVIEW);

    return 0;

}



LRESULT OnPrint(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)

{

    m_view.ExecuteId(ID_OOo_PRINT);

    return 0;

}
结论
OOO文档窗口,在原生Win32应用集成OpenOffice.org 3.0,是可能的一些工作。跟企业相关的WTL的替代脚本或业务处理文件的宏编程。历史1.10.2009 - 初始版本2009年2月16日更新?atlOOo.h:在OOo的固定的臭虫:IsAvailable(),OOO:TerminationMonitor,小的代码改进,到OOo的改变函数名:DocWindow:OpenFileDocument和OOo的:DocWindow:OpenNewDocumentWtlOOo应用:添加新功能和OOo的文件:在_tWinMain TerminationMonitor。 文章据此更新

回答

评论会员:tiutababo 时间:2011/12/28
我不能运行OOoCpp.js,它返回我一个"错误[对象错误]"。我觉得莫名其妙,我没有方法shell.RegRead。不过,我已经成功运行cppumaker,它使所有包括cppinclude文件。当我试图编译WtlOOo,我已经有众多的type.h编译错误,如语法错误(共44),缺少')',';'等也有在any.h错误,如缺少类型说明假设诠释。 C不支持默认int。 type.hxx错误,如{构造函数}的成员函数redelclaration不允许和"_pType":函数样式初始似乎是一个函数的定义。

我丢失了一些其他的配置?

在此先感谢
评论会员:。tiutababo 时间:2011/12/28
一个更多的事情。我试图在Windows XP上VS2008的编译
评论会员:。阿兰里斯特 时间:2011/12/28
嗨,tiutababo写道:我不能运行OOoCpp.js,它返回一个"错误[对象错误]"。我觉得莫名其妙,我没有方法shell.RegRead
也许你应该重新安装} {A15的WSH]

tiutababo写道:不过,我已经成功运行cppumaker,它使所有包括cppinclude文件。当我试图编译WtlOOo,我已经有众多(共44个)编译错误

在VS物业经理改变OOo.vsprops OOoSdkDir用户宏的价值您OOO SDK安装的绝对路径\ SDK文件夹。

如果您安装的Open Office是3.1,你应该下载并准备匹配3.1 SDK({A16}])

欢呼声中,
AR
评论会员:tiutababo 时间:2011/12/28
您好阿兰,

感谢您的及时答复。我已经改变了值,相应的绝对路径。我觉得我所做的一切手动OOo的脚本。它仍然无法正常工作。我有最新版本的SDK。然而,我国的开放式办公是3.0.1而不是3.1.0。我会得到的最新版本和测试,如果它影响。虽然,我认为它不应该,因为你的可执行文件正常工作。应该有一些与环境的设置出了问题。任何想法?

修改上,2009年8月5日,日(星期三)3:44 AM
评论会员:阿兰里斯特 时间:2011/12/28
tiutababo中写道:我的SDK的最新版本。然而,我国的开放式办公是3.0.1而不是3.1.0。

您不能使用3.1 SDK 3.0.1 OOO {S2}

欢呼声中,
AR
评论会员:mhorowit 时间:2011/12/28
我装SDK和运行命令描述,但我得到的是未定义文件
C:\文件和设置\ martin_2 \我的文档\ Visual Studio的2005 \ \ wtlooo \ atlooo.h(30):致命错误C1083:无法打开包括文件:"COM /太阳/明星/郎/ XMultiComponentFactory.hpp":没有这样的文件或目录

COM /太阳/明星/
只包含一个UNO子目录
我使用美国英语WINXP vst2005,openoffice.org 3.0 SDK,开放式办公3.0安装和运行应用
评论会员:阿兰里斯特 时间:2011/12/28
喜马丁,mhorowit写道:C:\ Documents和Settings \ martin_2 \我文件\ Visual Studio 2005的\项目\ wtlooo \ atlooo.h(30):致命错误C1083:无法打开包括文件:"COM /太阳/明星/ LANG / XMultiComponentFactory.hpp':没有那个文件或目录
COM /太阳/明星/
只包含一个UNO子目录
看起来像你没有运行OOoCpp.js它的结束(等待,直到控制台自动关闭)或没有更新项目的OOo.vsprops OOoCpp.js产生一个。
打开OOo.vsprops VS物业经理和检查,用户宏程序OOoSdkDir的价值是的绝对路径,你的LT; OOoSdkInstallationgt; \ SDK目录。在此位置\ \ includecpp目录所有的#include atlOOo.h指令的根源。

欢呼声中,
AR
评论会员:grisp 时间:2011/12/28
。HI

是否有任何方式与您的代码中使用另一种引导的方式(如defaultBootstrap_InitialComponentContext())?使用:CPPU:引导()的一个主要问题有:面向对象的服务器被冻结的情况下,如果:CPPU:引导()调用将冻结客户端应用程序以及。所以我想找到的方式来控制/在这种情况下重新启动的面向对象的服务器..

感谢
评论会员:。阿兰里斯特 时间:2011/12/28
您好,
grisp写道:面向对象的服务器被冻结的情况下,如果:CPPU:引导()调用将冻结客户端应用程序以及

如果OOo的是不健康的,我怀疑你可以从它那里得到任何东西。

{A17}]::CPPU:引导()函数以类似的方式实现的Java com.sun.star.comp.helper.Bootstrap.bootstrap()方法。它首先引导通过调用本地组件上下文:CPPU::defaultBootstrap_InitialComponentContext()函数,然后,尝试建立使用com.sun.star.bridge.UnoUrlResolver服务命名管道连接到运行Office。如果没有运行办公室,办公室的过程开始。如果连接成功,则返回远程组件上下文

欢呼声中,
AR
评论会员:grisp 时间:2011/12/28
确定,让我们远离面向对象的服务器的稳定性{S2}

那么您认为它可能使用套接字通信服务器(服务器启动与接受=插座,主机= localhost,端口= 8100; URP; StarOffice.ServiceManager),然后将其连接defaultBootstrap_InitialComponentContext()

我想实现这个,越来越XComponentContext和XMultiComponentFactory,但我不能得到任何XSystemChildFactory / XWindowPeer引用...我有一个堆栈溢出异常有..

感谢
评论会员:。阿兰里斯特 时间:2011/12/28
您好,

grisp写道:那么您认为它可能使用套接字通信服务器(启动服务器接受=插座,主机= localhost,端口= 8100; URP; StarOffice.ServiceManager),然后连接defaultBootstrap_InitialComponentContext()
? AFAIK OOO SDK示例实现此方法的正确运行。
本文的代码的意图是帮助在OpenOffice.org的Windows(TM)用户目标明确的GUI应用程序的集成,并承担有关支撑平台的无关(支持Win32除外)。

您可能会问,在{A18} C OOo的问题]

欢呼声中,
AR
评论会员:阿兰里斯特 时间:2011/12/28
我一直在报道OOoCpp.js失败,如果安装的OpenOffice.org是丹麦的语言版本

这个版本的安装关键是[HKLM | HKCU \ SOFTWARE \ OpenOffice.org \ Layers_ \ OpenOffice.org \ 3 \ OOoCpp.js线#56,必须相应地编辑

请在这里报告任何模拟问题,我将更新脚本,如果必要的。
感谢您的支持,
AR
评论会员:surajfrommumbai 时间:2011/12/28
对不起,我奋斗了整整一夜,并没有能够构建应用程序....它的令人沮丧的
评论会员:阿兰里斯特 时间:2011/12/28
surajfrommumbai写道:我奋斗了整整一夜,并不能构建应用程序

据我所知{S4}的你能更明确?
欢呼声中,
AR
评论会员:阿兰里斯特 时间:2011/12/28
我想您的应用程序现在和完美。
我打开PPS和DOCX和我,没有任何问题,以PDF格式保存。感谢您分享阿兰
很明显,你得到了我的5。

Dr.Luiji

信托,你会被信任。

尝试{A19}]一个新的新面孔,为您的Windows Mobile代码项目:
|