大家好!想必大家都知道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.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://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=""$(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"這句命令,注意,里面有些路徑是我的,各位朋友自己修改下吧.然后,手動生成的頭文件就完成了.手動配置也就到這里了.
到這里,所有的配置方法和技巧都介紹完畢了.本來想貼些代碼上來的,但是又沒時間去搞些簡單的例子,這里介紹各位朋友去看看http://blog.csdn.net/douyangyang/article/details/4152914 小南地帶的這篇代碼解說.希望各位朋友能迅速掌握openoffice的開發技巧,之后會陸續貼上一些例子和openoffice的一些原理講解,這個就..下回分解吧~