vs+openoffice

参考1:

    大家好!想必大家都知道OpenOffice这个一个跨平台的免费办公软件吧!OpenOffice是Apache的开源项目,不仅仅使用起来方便,它还具备一个强大的开发套件——UNO组件.这也使得我们开发者可以在不同平台,不同语言下开发办公类软件.其实OpenOffice的架构非常清晰,学习起来难度不会特别大,而且也非常有趣.其功能也是相当强大,可以操作很多类型的文件,例如MS office的文件,时下比较流行的pdf文档,jpg图片等各种文件.建议有这方面需要的朋友去学习下如何使用OpenOffice.不过使用OpenOffice还有个小问题,就是环境配置非常的麻烦,特别是for vc++,这个可能难倒了不少初学者.在此我总结了一些方法并且记录下来,让自己方便翻看的同时也帮助一些初学的朋友们.

  在开始前,我首先要说明下,我引用过的资料.分别是 

  http://blog.csdn.net/douyangyang/article/details/4085703 小南地带的文章

  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.exezip.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://blog.csdn.net/douyangyang/article/details/4134816小南地带的方法稍微进行改进下的.

  好了,在开始前我先要上一个来自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="&quot;$(OOoSdkDir)\include&quot;;&quot;$(OOoSdkDir)\includecpp&quot;"
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"这句命令,注意,里面有些路径是我的,各位朋友自己修改下吧.然后,手动生成的头文件就完成了.手动配置也就到这里了.

  到这里,所有的配置方法和技巧都介绍完毕了.本来想贴些代码上来的,但是又没时间去搞些简单的例子,这里介绍各位朋友去看看http://blog.csdn.net/douyangyang/article/details/4152914 小南地带的这篇代码解说.希望各位朋友能迅速掌握openoffice的开发技巧,之后会陆续贴上一些例子和openoffice的一些原理讲解,这个就..下回分解吧~

参考2:

其中JS脚本需要注意:

1、分64与32位版本,两版本注册表位置不一样

64.js

复制代码
  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\\Wow6432Node\\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  }
复制代码

32.js,去掉“Wow6432Node”即可

那个OOo.vsprops我没用起来,直接设置的:

目录设置

要使用$(OOoSdkDir),需要添加OOoSdkDir环境变量

C/C++

 

LIB、 DLL

还要注意:需要自己添加

#define CPPU_ENV msci

对函数 FindInstallAndSetPath也要修改:

要加入32/64位系统判断,

注册表位置(参考js)

 

另外,OUString::createFromAscii 相当不好

最好这样使用:

OUString sDocUrl(sFile1); 

OUString sSaveUrl(sFile2);

因为,sFile1 可能包含有非Ascii字符,这要出错的!

 

 

-------------------

Reference<XStorable> rStore (xWriterComponent, UNO_QUERY);  

   如果sSaveUrl格式是OO的标准格式(odl、...)好像可以直接用下面这个
    rStore->storeAsURL( sSaveUrl, Sequence < ::com::sun::star::beans::PropertyValue >() );  

  否则要这样:

    Sequence<PropertyValue> storeProps(1);  
    storeProps[0].Name = OUString::createFromAscii("FilterName");  
    storeProps[0].Value = Any( OUString::createFromAscii("MS Word 97") );
    rStore->storeAsURL( sSaveUrl, storeProps);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值