|
|
用户名:wallimn 笔名:wallimn 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
欢迎访问wallimn的博客,欢迎大家多交流,希望跟有共同爱好的人做朋友!
邮件:wallimn@sohu.com
网络硬盘:http://wallimn.gbaopan.com(可下载博客中提到的相关资源、代码)
欢迎访问我的主博客:http://blog.csdn.net/wallimn
大家好,关于我的博客
(作者置顶)
我的WORD2003手写签名插件出新版本了
(作者置顶)
WORD2003签名签章插件介绍==wallimn
(作者置顶)
WORD203签名签章插件
1.前言
这是我学习ATL的成果,学习过程及程序的编写,前前后后共用了二十多天的时间,花了不少的心血。其间遇到了不少困难,终于都一一解决了。这要感谢www.csdn.net上的热心朋友,从他们的BLOG文章中,我获得了不少灵感。现在这个软件基本完成了,全部实现了我自己定的设计需求,自己觉得这个软件还有一定的用处,就把它的测试版发布一下,希望作用者多提宝贵意见。
注:测试版没有任何的功能限制,只是显示了“Beta 1.0”字样,对试用没有任何影响,也没有使用时间的限制。
2.功能
可以完成手写签名及插入签章的功能。插入签名或签章后,可以监控WORD文档是否被修改。软件的使用界面很简单,只是在WORD里插入了一个工具栏,上面有三个按钮。其它的功能在插入的签名或签章上按右键根据弹出菜单选择执行。
印章支持多种格式图片,如BMP,JPG,GIF(静止的)等,使用时用印章管理工具把这些导入到印章库即可。
印章库管理密码:12345
3.软件的使用:
软件包含七个文件:
steal.mdb 印章库。
xxhsignature.ini 配制文件,如果没有会自动生成。
XXHSignature.dll WORD2003的COM加载项。程序的主体。
Register.exe 注册XXHSignature.dll用,可以不使用,直接使用regsvr32。
UnRegister.exe 卸载XXHSignature.dll用,可以不使用,直接使用regsvr32 /u。
StealManager.exe 印章管理工具。
说明文档.txt 说明文档。
软件使用VC6、ATL开发,没有使用MFC,所以每个软件都很小巧。
我在开发时使用的环境为XP、WORD2003,对软件在其它环境下没有进行过测试,不知道存不存在兼容问题。期待大家的反馈,可以给我发EMAIL,或者到我的博客留言。
如果程序运行有问题,可以使用Unregister或regsvr32 /u将其卸载即可。也可以使用WORD的加载项管理菜单(该菜单默认时不显示,可以点击工具->自定义中找到使之显示),禁止插插件启动时运行。
另外:软件编译为UNICODE,对WIN98肯定是不支持。
欢迎转载,转载时请不要删除这些信息。谢谢。
2006-04-25
作者:wallimn
email:wallimn@sohu.com
QQ:54871876
博客:http://wallimn.bokee.com
下载请访问我的网络硬盘,地址:
http://www.soeasy.net.cn/pickFilesAction.do?topicId=1498419&uid=1498355
http://wallimn.gbaopan.com(需要注册为该网站的用户,有些麻烦)
补充说明:
控件注册使用regsvr32(系统提供的注册控件工具,可以在开始->运行中输入)
regsvr32 控件路径名\插件名
regsvr32 -H 可以看一下帮助
注册后,一般会出现个工具栏,有的机器不知为什么不出。
这时,可以工具->自定义,选择命令选项卡,左边选工具,右边找到COM加载项,把它拖到菜单或工具栏上。关闭自定义窗口。点击COM加载项,把签名插件勾选一下就可以了。
软件运行截图见另外一篇文章http://wallimn.bokee.com/5532495.html
Word手写签名插件(COM加载项、VC6.0ATL)开发思路
(作者置顶)
JSP中,AJAX使用POST方式提交中文乱码问题解决
/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:王力猛 (wallimn)
电邮:wallimn@sohu.com
博客:http://wallimn.bokee.com
时间:2006-11-15
/***********本人原创,欢迎转载,转载请保留本人信息*************/
今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们。我的开发环境:XP, eclipse,使用GB18030编码。
当遇到这个问题时,到网上去查了好多文章,提到几种解决方案,如:全站UTF-8编码;请求头编码为中文;使用javascript中的escape函数。
使用GET方式提交数据的时候,中文问题很好解决,setrequestheader("Content-Type","text/html; encoding=gb18030")就可以了。但这个方法在POST方式中却不起作用。大家都知道GET方式提交数据有长度限制,有时我们必须使用POST方式来提交数据。
但对于POST方式,使用上述的几种方法经过多次测试,问题依旧。我郁闷了好几天。
今天把问题解决了,很简单,是使用escape(或encodeURI,两个函数javascript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这是解决问题的关键。
我的例子涉及两个页面,一个是初始页面,一个是AJAX请求处理页面。
初始页面内容如下(hello.jsp):
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>AJAX提交页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<script type="text/javascript">
function justdo(){
var post="name=王力猛&email=wallimn@sohu.com&bokee=http://wallimn.bokee.com";
post = encodeURI(post);
post = encodeURI(post);//两次,很关键
var xmlObj = new ActiveXObject('Msxml2.XMLHTTP');
var URL = '<%= path%>/page/act.jsp';//文件名需要调整成测试时的相应位置?
xmlObj.open ('post',URL,true);
xmlObj.setrequestheader("cache-control","no-cache");
xmlObj.setrequestheader("Content-Type","application/x-www-form-urlencoded");
xmlObj.send (post);//注意:POST方式,使用这个来发送内容?
}
</script>
</head>
<body>
<input type="button" value="提交" onclick="justdo()"/>
</body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
ajax请求处理页面(act.jsp)的内容如下:
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="java.net.URLDecoder"%>
<html>
<head>
<title>ajax deal</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
//遍历输出参数内容。
for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
String h = (String) e.nextElement();
String v = request.getParameter(h);
String mm = java.net.URLDecoder.decode(v, "UTF-8");
System.out.println("请求参数: " + h + " = " + mm);
}
%>
</body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
分析:当调用request.getParameter()函数时,会自动进行一次URI的解码过程,调用时内置的解码过程会导致乱码出现。而URI编码两次后,request.getParameter()函数得到的是原信息URI编码一次的内容。再用可控的解码函数java.net.URLDecoder.decode()就可解出原始的正确的信息。
以上分析纯属个人看法,不知是否正确。
VC知识库的离线包整合
我想用VC的人可能都会知道http://www.vckbase.com,网站上的VC知识库离线包也是非常的不错,可以帮你解决绝大部分编程中遇到的问题。但它只是前20集有个合订本,后来的都是一集一集单的,使查找东西非常的不方便。
我的室的郭教员花了些时间跟心思(有个CHM merge工具,只能合并20个文件,郭教员用自己的方法把它解决了。),把目前的1-46期合并起来建了个全部的索引文件,可以在全部知识库中搜索、建立标签。真是方便。如果有其它VC程序员需要,请与我联系,我可以Email你们一份。好东西大家用。我的Email: wallimn@sohu.com
谈如何捕获OFFICE软件的事件
作者:wallimn(wallimn@sohu.com、http://wallimn.bokee.com)欢迎转载,转载请保留作者信息。
今天很高兴,终于学会捕获Microsoft Office PowerPoint的事件。写出来给大家分享。我发现网上原创的文章少,转载的文章多,我来为原创做点贡献。
本文以PPT为例,其原理应该适用于WORD及EXCEL,假定读者有些使用ATL开发OFFICE插件(或COM)的基础。所谓事件,在PPT中是指SlideShowBegin(播放开始)、SlideShowEnd(播放结束)等,所有事件的名字和含义可以PPT的VBA帮助章节找到。
作者的测试环境为VC6.0,使用ATL框架。测试的基础软件框架使用的是徐景周(很感谢这位高人,代码及文章给了我很大的帮助)的《PowerPoint2K/XP插件开发》中的源码,相关源码及文章可以到www.vckbase.com上找到。插件开发的相关细节这里就略过了。
其实技术就是一层纸,非常的简单,在此我也不打算详细的说,把几个要点说一下。其实是仔细分析了自定义按钮单击事件的代码后,经过一上午的测试实现了PPT播放事件的捕获。主要就是在几个地方加入些代码。
1.使插件类继承public IDispEventSimpleImpl<11/*自定的不重复正数*/, CPowerPoint2000Addin, &__uuidof(MSPPT::EApplication)>
定义一个转义:typedef IDispEventSimpleImpl</*nID =*/ 11,CPowerPoint2000Addin, &__uuidof(MSPPT::EApplication)> PPTEvents;
2.声明一个结构,标识响应函数信息(第一个必须为CC_STDCALL,后面是返回值,参数个数及类型)
_ATL_FUNC_INFO OnPPTEventInfo = {CC_STDCALL,VT_EMPTY,1,{VT_DISPATCH}};
3.增加事件映射
BEGIN_SINK_MAP(CPowerPoint2000Addin)
//SINK_ENTRY_INFO(1,__uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01,OnClickButton1, &OnClickButtonInfo)
SINK_ENTRY_INFO(11,__uuidof(MSPPT::EApplication),/*dispid*/ 2011,SlideShowBegin, &OnPPTEventInfo)//2011,DISPID,可以在MSDN上查到
END_SINK_MAP()
其它DISPID
2001 WindowSelectionChange
2002 WindowBeforeRightClick
2003 WindowBeforeDoubleClick
2004 PresentationClose
2005 PresentationSave
2006 PresentationOpen
2007 NewPresentation
2008 PresentationNewSlide
2009 WindowActivate
2010 WindowDeactivate
2011 SlideShowBegin
2012 SlideShowNextBuild
2013 SlideShowNextSlide
2014 SlideShowEnd
2015 PresentationPrint
2016 SlideSelectionChanged x
2017 ColorSchemeChanged x
2018 PresentationBeforeSave x
2019 SlideShowNextClick x
4.声明事件
void __stdcall SlideShowBegin (IDispatch * /*struct SlideShowWindow * */ Wn );
实现事件
void __stdcall CPowerPoint2000Addin::SlideShowBegin (IDispatch * /*struct SlideShowWindow * */ Wn )
{
MessageBox(NULL, "SlideShowBegin", "SlideShowBegin" , MB_OK);
// return S_OK;
}
5.激活新增的事件连接点
hr = PPTEvents::DispEventAdvise((IDispatch*)m_spApp);
if(FAILED(hr)){
//MessageBox(NULL, "FAILED", "FIELED", MB_OK);
}
这样就可以了,可以点击PPT播放按钮看一下效果,是不是弹出了自己的对话框。提示,不要忘了在插件卸载的时候断开新增的连接点事件。调试的时候不要忘记把OFFICE库改成自已机器上库的相应路径及版本。
所有源码请到我的网络硬盘(http://wallimn.gbaopan.com)下载,更多信息请访问我的博客(http://wallimn.bokee.com)