vs+openoffice 悠悠 2022-08-13 18:59 146阅读 0赞 参考1: 大家好!想必大家都知道OpenOffice这个一个跨平台的免费办公软件吧!OpenOffice是Apache的开源项目,不仅仅使用起来方便,它还具备一个强大的开发套件——UNO组件.这也使得我们开发者可以在不同平台,不同语言下开发办公类软件.其实OpenOffice的架构非常清晰,学习起来难度不会特别大,而且也非常有趣.其功能也是相当强大,可以操作很多类型的文件,例如MS office的文件,时下比较流行的pdf文档,jpg图片等各种文件.建议有这方面需要的朋友去学习下如何使用OpenOffice.不过使用OpenOffice还有个小问题,就是环境配置非常的麻烦,特别是for vc++,这个可能难倒了不少初学者.在此我总结了一些方法并且记录下来,让自己方便翻看的同时也帮助一些初学的朋友们. 在开始前,我首先要说明下,我引用过的资料.分别是 [http://blog.csdn.net/douyangyang/article/details/4085703][http_blog.csdn.net_douyangyang_article_details_4085703] 小南地带的文章 [http://www.codeproject.com/KB/wtl/Wtl\_OOo.aspx][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]和[http://www.openoffice.org/download/other.html\#tested-sdk][http_www.openoffice.org_download_other.html_tested-sdk]找到它们,记得要下windows的喔! 分别安装OpenOffice.org和SDK 安装就不多说了,值得说下的SDK的安装目录下面有个index.html,打开可以里面有很很多关于安装和使用的好东东 Installation Guide是必须要看下的,里面有很多关于配置方面的. [Developer's Guide][Developer_s Guide]就尽量下载回来,非常全面,讲述了OpenOffice的技术原理和API用法,可惜例子都是java的,不过相信对各位搞C++朋友来说,看懂也不会成为一个很大的障碍吧~ 2.好,第二步就是下载一些必要的软件 (1)**JDK (1.4.1\_01 or higher)** 地址 [http://java.sun.com/products][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/][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][http_www.info-zip.org]找到,我下载的是Wiz,记得下win32的 嗯~如果你都下好了,那就可以正式开始配置了. 3.找到SDK安装目录下的一个**setsdkenv\_windows.bat**,它是用来批处理环境变量的,你配置好它以后,每次编译例子的时候就在CMD先使用它来设置好即可 ![FirstTimeStart.JPG][] 我们首先看到的是要我们输入一个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"即可忽略. ![SetDirectory3.JPG][] 最后批处理程序还会让你设定一个默认的编译输出目录,以后你使用这个方法编译的东东都会输出到那里去, 在这里我们可以直接使用默认好的. 最后再输入一次"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_blog.csdn.net_douyangyang_article_details_4134816]小南地带的方法稍微进行改进下的. 好了,在开始前我先要上一个来自[http://www.codeproject.com/KB/wtl/Wtl\_OOo.aspx][http_www.codeproject.com_KB_wtl_Wtl_OOo.aspx] 的Alain Rist的脚本文件 ![复制代码][copycode.gif] 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 } ![复制代码][copycode.gif] 这个脚本本来有一个地方是有错误的,Alain Rist也提到了,不过它已经被我修改好了,就是56行的Layers\_那里,貌似英文版的是Layers,所以是会出错的.把这个脚本保存成OOoCpp.js在 SDK的.../sdk/的安装目录下 运行! 如果没有error出来,那么!恭喜你!你已经配置好了.如果没有成功,我后面会说说手动配置的方法 接下来,我们假设已经成功 我们需要把一下的代码修改下,并且保存成OOo.vsprops到你每一个需要用到OpenOffice的工程下,这个文件只是一个vs的属性设定文件,如果不使用它,讲意味着你需要自己手动配置vs, 这个是比较麻烦的 ![复制代码][copycode.gif] 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> ![复制代码][copycode.gif] 值得注意的是,在[http://www.codeproject.com/KB/wtl/Wtl\_OOo.aspx][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][http_www.codeproject.com_KB_wtl_Wtl_OOo.aspx] Alian Rist ![复制代码][copycode.gif] 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 } ![复制代码][copycode.gif] 如你所见,这个是一个启动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][http_blog.csdn.net_douyangyang_article_details_4152914] 小南地带的这篇代码解说.希望各位朋友能迅速掌握openoffice的开发技巧,之后会陆续贴上一些例子和openoffice的一些原理讲解,这个就..下回分解吧~ 参考2: 其中JS脚本需要注意: 1、分64与32位版本,两版本注册表位置不一样 64.js ![复制代码][copycode.gif] 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 } ![复制代码][copycode.gif] 32.js,去掉“**Wow6432Node**”即可 那个OOo.vsprops我没用起来,直接设置的: **目录设置** ![Image 1][] 要使用$(OOoSdkDir),需要添加OOoSdkDir环境变量 ![Image 1][] **C/C++** ![Image 1][] **LIB、 DLL** ![Image 1][] 还要注意:需要自己添加 **\#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); [http_blog.csdn.net_douyangyang_article_details_4085703]: http://blog.csdn.net/douyangyang/article/details/4085703 [http_www.codeproject.com_KB_wtl_Wtl_OOo.aspx]: http://www.codeproject.com/KB/wtl/Wtl_OOo.aspxde [http_www.openoffice.org_download]: http://www.openoffice.org/download/ [http_www.openoffice.org_download_other.html_tested-sdk]: http://www.openoffice.org/download/other.html#tested-sdk [Developer_s Guide]: http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Apache%20OpenOffice_Developers_Guide [http_java.sun.com_products]: http://java.sun.com/products [http_sourceforge.net_projects_mingw_files]: http://sourceforge.net/projects/mingw/files/ [http_www.info-zip.org]: http://www.info-zip.org/ [FirstTimeStart.JPG]: /images/20220810/7e8af14916704eb5b3f444f46b1800c6.png [SetDirectory3.JPG]: /images/20220810/4e236361070a4281970a4c9b6a798366.png [http_blog.csdn.net_douyangyang_article_details_4134816]: http://blog.csdn.net/douyangyang/article/details/4134816 [copycode.gif]: /images/20220810/5727e30f3fe84ca6af8040843731ca7c.png [http_blog.csdn.net_douyangyang_article_details_4152914]: http://blog.csdn.net/douyangyang/article/details/4152914 [Image 1]:
还没有评论,来说两句吧...