{A}
{S0}演示
。
这篇文章应该让你开始一个WTL(或其他原生Win32)的应用程序集成到OpenOffice.org电源。
预览
首先,您需要下载并安装OpenOffice.org 3.0从,如果尚未完成。
接下来,从{A6}提取的WtlOOo.exe应用到任何合适的位置,并运行它。尝试打开你手边的任何Microsoft Office文件,并检查打印和打印预览能力,以及保存到PDF功能。
这些功能,内置的OOo的被称为使用{A7}类通过一个简单的WTL的命令处理程序。
准备OOo的SDKclass 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;
}
//...
使用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的知名度和执行命令的用法。
WtlOOo用法的COOoCtrlbool 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启动一个简单的(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。
文章据此更新