用Word编程?可笑?谁说不可以!!!

我的想法来自于昨天上午看到的人人网上一好友发布的这则笑话:

用Word编程?可笑?谁说不可以!!!_第1张图片

上机课,用VC编程。某女坐某男旁,突然女问男,“为什么你的关键字会变蓝而我没有?”男看了一下,没来得及说话,女又问,“为什么我有的字会有波浪线而你没有啊?”男又看了看女的电脑,说,“为什么你要用Word来编程?”

我最开始也觉得可笑,还回复了“int首字母被大写了”,“而且没有返回值。。。”之类的话。不过到了下午越想越觉得不对,谁说不可以用Word编程?Visual Studio不过也就是IDE,Word具备文本编辑功能,那我也可以通过增加插件来让Word能够编译、链接、运行程序。

于是我就要证明给乃们看,乃们啊,too simple。。。

本人一直蛮喜欢WPS Office,于是就针对WPS开发了一个插件,实际上MS Office的插件开发也差不多。

通过谷哥和度娘,我找到了这个链接:09年的WPS Office插件开发大赛的学习资源:

http://www.wps.cn/index.php?mod=zhuanti&act=plugin&do=ziyuan

在这里可以下载插件示例和视频教程,视频什么的就不用看了,我的插件参考了这两个示例:

DemoWpsEvents: VC++,响应WPS文字的事件通知示例

DemoWpsInsertTim:VC++开发WPS文字插件示例

具体来说,参考了DemoWpsEvents的弹出框函数和DemoWpsInsertTim的OnClick函数。

PS:我用的是Visual Studio 2005的VC++开发,而示例里面是VS2008的工程,需要转换一下,但是VS只提供了自动从低版本升级为高版本,这里推荐个开源项目:Visual Studio Project Converter,链接 http://sourceforge.net/projects/vspc/

WPS Word的插件开发用的是ATL,最终的编译结果是一个dll,不过要让WPS能安装插件的话,还需要一个XML格式的描述文件,这个参考示例里的文件就行。

---------------------------------我是分割线------------------------------------------------

下面说一下插件dll的开发。

一、加载WPS Office提供的二次开发dll包,位于StdAfx.h中。

你需要根据你的WPS Office的安装位置修改路径名。

#import "D:\Program Files\Kingsoft\WPS Office Personal\office6\wpscore.dll" rename_namespace("WPS")

二、编写具体的事件处理代码,位于DemoWpsInsertTime.h中。

2.1 首先我们要指定在“WPS Word插件栏”里的自定义插件的标题和Tooltip内容:

核心代码:

m_spButton->Caption = _bstr_t(L"Word编程器");
m_spButton->TooltipText = _bstr_t(L"谁说不能用Word写代码 by chenxupro!");

2.2 编写OnClickButton函数。

主要思路:选中需要编译的文本->另存为SourceCodeFile.c->调用编译器编译成SourceCodeFile.exe->运行并输出结果。

2.2.1 获取需要编译的文本内容

WPS::_DocumentPtr spDoc = m_spWpsApp->ActiveDocument;
WPS::RangePtr spRange = spDoc->_Selection->Range;
char* SelectedText=_com_util::ConvertBSTRToString(spRange->Text);

2.2.2 另存为SourceCodeFile.c

这个就不多说了,最简单的写文件。有个需要注意的地方就是如果不经处理就将SelectedText存成文件的话编译是不通过的,这主要是因为\r和\n的问题,我这里通过CString作为中介Replace了一下:

CString ReplaceTmpString(SelectedText);
ReplaceTmpString.Replace(L"\r",L"\r\n");

再从CString转回char *,我没学过VC,所以可能用的都不是最优方法,没准还有错。

char* ChRtn = (char*)malloc(ReplaceTmpStringLength*sizeof(char));
memset(ChRtn, 0, ReplaceTmpStringLength); 
USES_CONVERSION; 
strcpy((LPSTR)ChRtn,OLE2A(ReplaceTmpString.LockBuffer())); 

然后在将ChRtn写入C:\SourceCodeFile.c即可。

2.2.3 调用编译器编译成SourceCodeFile.exe

这个方法就多了,在Windows平台下可以使用VC自带的命令行编译工具,也可以用GNU GCC编译器。

为了图方便,我就直接用VC自带的命令行编译工具cl.exe,最基本的参数:

cl.exe C:\SourceCodeFile.c /o C:\SourceCodeFile.exe

原本想用管道PIPE来操作整个编译运行的过程的,结果搞了半天都不行,可能是写法有误,于是就用了最简单的system方法来调用cmd命令。并将运行的结果重定向到了SourceCodeRunResult.txt,最后读取SourceCodeRunResult.txt,将运行结果输出到MessageBox。

到这里整个插件dll就写好了,我们可以通过打开WPS Word->工具->办公小工具->安装本地插件,来试运行我们自己写的插件。

具体代码可以到这里下载:

http://download.csdn.net/detail/chenxupro/4053219

更多好玩的东西,请关注我的博客:

http://www.chenxupro.com/proxblog/

下面是运行结果图:



你可能感兴趣的:(WPS,Word,ATL)