大家好!想必大家都知道OpenOffice这个一个跨平台的免费办公软件吧!OpenOffice是Apache的开源项目,不仅仅使用起来方便,它还具备一个强大的开发套件——UNO组件.这也使得我们开发者可以在不同平台,不同语言下开发办公类软件.其实OpenOffice的架构非常清晰,学习起来难度不会特别大,而且也非常有趣.其功能也是相当强大,可以操作很多类型的文件,例如MS office的文件,时下比较流行的pdf文档,jpg图片等各种文件.建议有这方面需要的朋友去学习下如何使用OpenOffice.不过使用OpenOffice还有个小问题,就是环境配置非常的麻烦,特别是for vc++,这个可能难倒了不少初学者.在此我总结了一些方法并且记录下来,让自己方便翻看的同时也帮助一些初学的朋友们.
在开始前,我首先要说明下,我引用过的资料.分别是
小南地带的文章
http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx 的Alain Rist的文章,有一些脚本和配置的东西都是来自他们的文章的
好吧,废话说了这么多,让我们开始正题吧!
1.首先我们要去下载OpenOffice.org和OpenOffice.org SDK我们可以在http://www.openoffice.org/download/和http://www.openoffice.org/download/other.html#tested-sdk找到它们,记得要下windows的喔!
分别安装OpenOffice.org和SDK
安装就不多说了,值得说下的SDK的安装目录下面有个index.html,打开可以里面有很很多关于安装和使用的好东东
Installation Guide是必须要看下的,里面有很多关于配置方面的.
Developer's Guide就尽量下载回来,非常全面,讲述了OpenOffice的技术原理和API用法,可惜例子都是java的,不过相信对各位搞C++朋友来说,看懂也不会成为一个很大的障碍吧~
2.好,第二步就是下载一些必要的软件
(1)JDK (1.4.1_01 or higher) 地址 http://java.sun.com/products,这个不是必须的,可以根据自己的语言需求来下载
(2)C++ compiler...
没有的话我就不知道说什么好了..反正有vs就可以了- -!
ps:我的配置使用vs2008的,vc6和其他会怎么样,我也不太清楚,不过应该问题不大.
(3)Microsoft .NET Framework SDK version 1.0 or higher
也是可选的,如果你安装vs的时候有安装了C#模块就会有的了~
(4)GNU make (3.79.1 or higher)
这个必须有,你可以在http://sourceforge.net/projects/mingw/files/找到它
我是下载了mingw-get-inst那个的~注意不要下了Cygwin的make tool,可能会有问题
PS:在解压安装完以后,找到<安装目录>/bin下的mingw32-make.exe,并且在这个目录下改名备份一个make.exe
(5)zip tool (2.3 or higher)
必须的,你可以到http://www.info-zip.org找到,我下载的是Wiz,记得下win32的
嗯~如果你都下好了,那就可以正式开始配置了.
3.找到SDK安装目录下的一个setsdkenv_windows.bat,它是用来批处理环境变量的,你配置好它以后,每次编译例子的时候就在CMD先使用它来设置好即可
我们首先看到的是要我们输入一个SDK路径,"[]"里面的是它从系统环境变量读取出来的值,你可以修改,不修改就直接enter跳过
mingw32-make.exe和zip.exe的目录,例如:我的mingw32-make.exe在g:/MinGW/bin/mingw32-make.exe,那就输入g:/MinGW/bin即可
接下来分别是c++,java,c#编译器的设置,vc++的就是<vs安装目录>/vc/bin,其他的也是类似的,因为是可选的项如果你不愿意输入就直接enter跳过,
它会询问你是否跳过,我们输入"YES"即可忽略.
最后批处理程序还会让你设定一个默认的编译输出目录,以后你使用这个方法编译的东东都会输出到那里去,
在这里我们可以直接使用默认好的.
最后再输入一次"YES"就可以了.
都设置好了以后程序会生成一个setsdkenv_windows.bat
在winXP下是在C:/Documents and Settings/<用户名>/Application Data/<openoffice版本名>/setsdkenv_windows.bat
而win7就是在C:/Users/<用户名>/AppData/Roaming/<openoffice版本名>/setsdkenv_windows.bat
这个要根据个人的操作系统去找.
经过一次设定一个SDK目录下的setsdkenv_windows.bat就不会再"运行"了,只会调用刚刚生成的新程序,如果你想重新设定,可以把新生成的程序删除掉即可.
完成这些以后,我们的初步设置已经完成了.
我们可以去编译一下SDK目录下examples的文件
我们可以打开CMD然后,
(1)运行setsdkenv_windows.bat
(2)cd到sdk的例子目录,例如我的是"cd G:\OpenOfficeSDK\sdk\examples\cpp\DocumentLoader"
(3)输入make或者mingw32-make来编译.
PS:你可以你默认的输出目录找到编译好的文件,然后在里面的include可以找到很多SDK开发需要的但是SDK又没有的头文件!(至于为什么这样,为什么一开始没有...我也不明白,有高手知 道的..也请告诉下我)
好了,编译SDK自带examples的配置到这里就结束了.如果setsdkenv_windows.bat提示类似err:XXXXXX is missing这样的错误,你就应该参考Installation Guide的环境变 量配置,到计算机->属性->高级系统设置 里面找到 环境变量 ,并且在当前用户的那个项下面配置好环境变量.
但是我们可是要在VC下开发啊,下面我将介绍下一些比较方便的配置方法,
这些方法都是把小南地带的方法稍微进行改进下的.
好了,在开始前我先要上一个来自http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx 的Alain Rist的脚本文件
1 // OOoCpp.js
2 //
3 // OpenOffice.org 3.0 SDK C++ code generation
4 //
5 // Note: This script MUST be run from the OpenOffice.org 3.0 SDK folder: <OpenOffice.org_3.0_SDK>\sdk
6 //
7 // Copyright (c) Alain Rist 2008, 2009
8 //
9 // The use and distribution terms for this software are covered by the
10 // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)
11 // By using this software in any fashion, you are agreeing to be bound by
12 // the terms of this license. You must not remove this notice, or
13 // any other, from this software.
14
15
16 // Elevated privilege check
17 try
18 {
19 var bElevated = false;
20 var Args = WScript.Arguments;
21 for (var i = 0; i < Args.length; i++)
22 if (bElevated = (Args(i) == "/elevated"))
23 break;
24
25 var AppShell = WScript.CreateObject("Shell.Application");
26
27 if (!bElevated && AppShell.IsRestricted("System", "EnableLUA"))
28 throw (WScript.Interactive == true) ? "Restricted" : "Elevation required.";
29 }
30 catch (e)
31 {
32 if (e == "Restricted")
33 AppShell.ShellExecute("WScript.exe", "\"" + WScript.ScriptFullName + "\"" + " /elevated", null, "RunAs");
34 else
35 WScript.Echo("Error: " + e);
36
37 WScript.Quit();
38 }
39
40 // OpenOffice.org 3.0 SDK C++ code generation
41 try
42 {
43 var fso = WScript.CreateObject("Scripting.FileSystemObject");
44 var SDKBase = fso.GetParentFolderName(WScript.ScriptFullName);
45
46 var Prog = SDKBase + "\\bin\\cppumaker.exe";
47 if (!fso.FileExists(Prog))
48 throw(Prog +" not found!\n");
49
50 var Dest = SDKBase + "\\includecpp";
51 if (!fso.FolderExists(Dest))
52 fso.CreateFolder(Dest);
53
54 var shell = WScript.CreateObject("WScript.Shell");
55
56 var Key = "\\SOFTWARE\\OpenOffice\.org\\Layers_\\OpenOffice.org\\3\\";
57 var InstallKey = "HKCU" + Key;
58
59 try
60 {
61 shell.RegRead(InstallKey);
62 }
63 catch (e)
64 {
65 InstallKey = "HKLM" + Key;
66 shell.RegRead(InstallKey);
67 }
68
69 var Source1 = shell.RegRead(InstallKey + "UREINSTALLLOCATION") + "misc\\types.rdb";
70 if (!fso.FileExists(Source1))
71 throw(Source1 + " not found!\n");
72
73 var Source2 = shell.RegRead(InstallKey + "BASISINSTALLLOCATION") + "Program\\offapi.rdb";
74 if (!fso.FileExists(Source2))
75 throw (Source2 + " not found!\n");
76
77 shell.CurrentDirectory = shell.RegRead(InstallKey + "UREINSTALLLOCATION") + "bin"
78 var Command = Prog + " -BUCR -O \"" + Dest + "\" \"" + Source1 + "\" \"" + Source2 + "\"";
79 var exec = shell.Exec(Command);
80
81 var PropFile = SDKBase + "\\OOo.vsprops";
82 if (fso.FileExists(PropFile))
83 {
84 var ts = fso.OpenTextFile(PropFile, 1);
85 var Text = ts.ReadAll();
86 ts.Close();
87 Text = Text.replace(/Value=".+"/, "Value=\"" + SDKBase + "\"");
88 ts = fso.OpenTextFile(PropFile, 2);
89 ts.Write(Text);
90 ts.Close();
91 shell.Popup("Path updated to " + SDKBase + " in OOo.vsprops", 10, WScript.ScriptName, 64);
92 }
93
94 while (exec.Status == 0)
95 WScript.Sleep(100);
96
97 if (exec.ExitCode)
98 WScript.Echo(Command + "\nReturned: " + exec.ExitCode);
99 else
100 {
101 WScript.Echo(Command + "\nExecuted without error.");
102 shell.Run(SDKBase);
103 }
104 }
105
106 catch (e)
107 {
108 WScript.Echo("Error " + e);
109 }
这个脚本本来有一个地方是有错误的,Alain Rist也提到了,不过它已经被我修改好了,就是56行的Layers_那里,貌似英文版的是Layers,所以是会出错的.把这个脚本保存成OOoCpp.js在 SDK的.../sdk/的安装目录下
运行!
如果没有error出来,那么!恭喜你!你已经配置好了.如果没有成功,我后面会说说手动配置的方法
接下来,我们假设已经成功
我们需要把一下的代码修改下,并且保存成OOo.vsprops到你每一个需要用到OpenOffice的工程下,这个文件只是一个vs的属性设定文件,如果不使用它,讲意味着你需要自己手动配置vs, 这个是比较麻烦的
1 <?xml version="1.0" encoding="Windows-1252"?>
2 <VisualStudioPropertySheet
3 ProjectType="Visual C++"
4 Version="8.00"
5 Name="OOo"
6 >
7 <Tool
8 Name="VCCLCompilerTool"
9 AdditionalIncludeDirectories=""$(OOoSdkDir)\include";"$(OOoSdkDir)\includecpp""
10 PreprocessorDefinitions="WNT"
11 />
12 <Tool
13 Name="VCLinkerTool"
14 AdditionalDependencies="isal.lib icppu.lib icppuhelper.lib isal.lib isalhelper.lib ireg.lib stlport_vc71.lib"
15 AdditionalLibraryDirectories="$(OOoSdkDir)\lib"
16 DelayLoadDLLs="sal3.dll;cppu3.dll;cppuhelper3MSC.dll"
17 />
18 <UserMacro
19 Name="OOoSdkDir"
20 Value="G:\OpenOfficeSDK\sdk"
21 PerformEnvironmentSet="true"
22 />
23 </VisualStudioPropertySheet>
值得注意的是,在http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx 上下载到的这个属性文件有个地方有点问题,就是irmcxt.lib,这个lib貌似在OpenOffice3.4的版本就已经没有了,我重装过SDK几次都没有发现,我猜测可能被合并去另外的了,可能能在一些地方生成,但是我实在不清楚,如果有高手看到,请帮我指正下~感激不尽!
然后,根据每个人的电脑,这个属性文件是需要修改的,就是在20行的字符串里,它是一个指向SDK安装目录的字符串,我的是G:\OpenOfficeSDK\sdk,各位朋友请自行修改.
搞好了以后,我们打开vs,在项目->属性->配置属性->常规->继承的项目属性表上面填写OOo.vsprops的路径就可以了,
如果你放在项目下了,就直接./OOo.vsprops就可以了.
好了,最后一步就是复制下Alain Rist的代码了,我在这里就直接贴出来了,但是我们要注意,在引用他的代码的时候写明出处和作者! http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx Alian Rist
1 //Alian Rist
2 #include <Windows>
3 inline LRESULT FindInstallAndSetPath()
4 {
5 // OpenOffice.org 3 installation key
6 static LPCWSTR sSubKey = L"SOFTWARE\\OpenOffice.org\\Layers_\\URE\\1";
7 HKEY hk = NULL;
8
9 // check for machine install
10 LRESULT lRes = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, sSubKey, 0, KEY_READ, &hk);
11
12 // check for user install
13 if (lRes != ERROR_SUCCESS)
14 if (::RegOpenCurrentUser(KEY_READ, &hk) == ERROR_SUCCESS)
15 lRes = ::RegOpenKeyEx(hk, sSubKey, 0, KEY_READ, &hk);
16
17 if (lRes != ERROR_SUCCESS)
18 return lRes;
19
20 // Allocate new PATH environment variable
21 PVOID pNewPath = calloc(MAX_PATH, sizeof(WCHAR));
22 if (!pNewPath)
23 return GetLastError();
24
25 // Get the UREINSTALLLOCATION directory
26 DWORD dwsize = MAX_PATH;
27 PWCHAR sNewPath = (PWCHAR)pNewPath;
28 if (lRes = RegQueryValueEx(hk, L"UREINSTALLLOCATION", NULL, NULL, (LPBYTE)sNewPath, &dwsize) == ERROR_SUCCESS)
29 lRes = wcsncat_s(sNewPath + wcslen(sNewPath), MAX_PATH - wcslen(sNewPath), L"bin;", 4);
30 RegCloseKey(hk);
31
32 // Return if no UREINSTALLLOCATION directory
33 if (lRes != ERROR_SUCCESS)
34 {
35 free(pNewPath);
36 return lRes;
37 }
38
39 // Get the old PATH environment variable
40 size_t sizeOldPath;
41 lRes = _wgetenv_s(&sizeOldPath, NULL, 0, L"PATH");
42 LPWSTR sOldPath = (PWCHAR)malloc(sizeOldPath * sizeof(WCHAR));
43 if (sOldPath && SUCCEEDED(lRes))
44 lRes = _wgetenv_s(&sizeOldPath, sOldPath, sizeOldPath, L"PATH");
45
46 // Add directory to PATH if not already there
47 if (SUCCEEDED(lRes) && !wcsstr(sOldPath, sNewPath))
48 {
49 // Resize mem for new PATH environment variable
50 if (sNewPath = (PWCHAR)(pNewPath = realloc(pNewPath, (wcslen(sNewPath) + sizeOldPath) * sizeof(WCHAR))))
51 // Append old PATH content to new
52 if SUCCEEDED(lRes = wcsncat_s(sNewPath + wcslen(sNewPath), sizeOldPath, sOldPath, sizeOldPath))
53 // Change PATH environment variable
54 lRes = _wputenv_s(L"PATH", sNewPath);
55 }
56
57 // Cleanup
58 free(sOldPath);
59 free(pNewPath);
60
61 return lRes;
62 }
如你所见,这个是一个启动openoffice一些加载项的函数,有了它我们可以更方便,直接复制到代码里面,然后在使用openoffice组件之前调用这个函数就可以了!
下面,前面提到在使用脚本失败的朋友可以看看如何手动配置.
我们可以发现SDK安装目录下.../sdk/bin下面有一个cppumaker.exe,它需要OpenOffice安装目录下.../URE/bin下面的一些dll,我们可以全部复制过去.
然后我们到.../sdk/下建立一个includecpp文件夹,再到CMD下cd到cppumaker.exe所在的目录,例如我的是"G:\OpenOfficeSDK\sdk\bin",然后直接使用cppumaker -BUCR -O "G:\OpenOfficeSDK\sdk\includecpp C:\Program Files\OpenOffice.org 3\URE\misc\types.rdb" "C:\Program Files\OpenOffice.org 3\URE\misc\services.rdb"这句命令,注意,里面有些路径是我的,各位朋友自己修改下吧.然后,手动生成的头文件就完成了.手动配置也就到这里了.
到这里,所有的配置方法和技巧都介绍完毕了.本来想贴些代码上来的,但是又没时间去搞些简单的例子,这里介绍各位朋友去看看 小南地带的这篇代码解说.希望各位朋友能迅速掌握openoffice的开发技巧,之后会陆续贴上一些例子和openoffice的一些原理讲解,这个就..下回分解吧~