Winexec UINT WinExec( LPCSTR lpCmdLine, UINT uCmdShow ); ShellExecute HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); CreateProcess BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
Category Archives: Language
CPP类型转换
1、static_cast
这是应该首先选用的转换方式,一般用于在相关类型间进行转换或在继承链中进行转换。
其运作方式类似于隐式转换 (比如int转为float,或指针转换为 void*), 而且它可以调用显示转换(当然包括隐式转换)。
在很多情况下, 显示声明static_cast是不必要的,
但有一点需要指出的是应当尽量避免type(XXX) 与(type)XXX 语法(详情见下文)。
然而type(XXX,YYY) 是安全的,而且一定会去调用构造函数。
static_cast也可以在父类及子类之间进行。 当子类向父类转换时是可以顺利进行的。但父类向子类转换时,只要子类没有继承virtual父类,就可以一直进行。但是它从父类转为子类时,不会做任何检查,即使类型不完全匹配。
2、const_cast
用来向一个变量增加或删除const属性。 其他任何C++ casts都无法完成此任务。
需要指出的是,当变量为const,该操作符是未定义的。
用它来声明一个非const类型的const引用是安全的。
当重载const类型的类成员变量时,该转换十分有用。
它也可以用来把一个对象增加const属性,比如调用重载的方法。
const_cast也适用于volatile,但很少见。
3、dynamic_cast
一般用来解决多态问题。你可以把指针或参考转换为任何继承链上的类型。
(一个多态类型至少用一个虚函数,无论是声明还是继承的)。
当从子类转换为父类时,dynamic_cast一定会成功。但从父类转换为子类,dynamic_cast会确保对象为子类的一个完全实现。
dynamic_cast将返回其是否可能。如果无法转换,他将返回NULL(对指针),或抛出std::bad_cast异常(对参考)。
dynamic_cast有一些限制:
如果在继承链中,同一类型有多个对象(dreaded diamond)同时你没有使用虚接口,转换不会进行。
他也只能应用于public继承,当protect或private继承时,会失败。
注意:
dynamic_cast需要编译器支持RTTI(运行时类型识别)。
4、reinterpret_cast
这是最危险的转换方式,慎用。 它直接把一种类型转换为另一种
(比如把值从一种指针转换为另一种指针,或把指针储存在int中, 或其他让人讨厌的事情)
使用reinterpret_cast,唯一能保证的是,当你从结构转回为原类型时,你能得到相同的结果。
当然,reinterpret_cast也有一些转换无法进行。
他通常用于比较奇怪的转换,或bit操作,比图把raw数据流转换为实际数据,或把数据储存在对齐指针的低字节。
当其他转换无法使用时,可以尝试reinterpret_cast
5、C-style cast
C-style cast 是使用(type)object 或 type(object)的转换方式。
C-style cast 被定义为下列转换中第一个成功返回的:
const_cast
static_cast
static_cast, then const_cast
reinterpret_cast
reinterpret_cast, then const_cast
在一些时候,他可以被用来替代其他casts,但用于他最后可能会调用reinterpret_cast(应显示调用),因此C-style cast是十分危险的。
除非你能保证,不会调用reinterpret_cast,或者reinterpret_cast一定会失败,否则不要轻易使用。即使如此,也应该考虑显示调用上面的转换。
当使用static_cast时,C-style casts 也可以忽略权限控制,这意味着他可以进行其他cast无法进行的操作。
这是避免C-style casts的一个不错的理由。
(翻译自Stack Overflow的一个帖子,水平有限,哈哈)
参考资料:
http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used
http://www.cplusplus.com/doc/tutorial/typecasting/
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Programming_Languages/C%2B%2B/Code/Statements/Variables/Type_Casting
统计Excel工时的VBA脚本
很久很久以前,用于统计公司工时的一个VBA脚本,只使用了一小段时间。
代码写的有些傻傻的,哈哈哈。
Sub Summary()
'统计行数
Dim TotalLine As Integer
TotalLine = 1
Dim i, j As Integer
i = 1
j = 1
Dim name As String
'清空上次统计信息
Sheet32.Range("A2:F301").ClearContents
'计算人名
name = Sheet1.Cells(2, 2)
name = Right(name, Len(name) - 3)
'遍历所有sheets
For i = 1 To 31
'每个sheets中有效行数
For j = 4 To 12
'判断一行是否为空
If (Worksheets(i).Cells(j, 1) = "" And Worksheets(i).Cells(j, 2) = "" And Worksheets(i).Cells(j, 3) = "" And Worksheets(i).Cells(j, 4) = "" And Worksheets(i).Cells(j, 5) = "") Then
'空行,不做处理
Else
'非空行,进行统计
TotalLine = TotalLine + 1
Sheet32.Cells(TotalLine, 1) = Worksheets(i).Cells(j, 4)
Sheet32.Cells(TotalLine, 2) = Worksheets(i).Cells(j, 5)
Sheet32.Cells(TotalLine, 3) = name
If (Worksheets(i).Cells(j, 2) = "/") Then
Sheet32.Cells(TotalLine, 4) = "0"
Else
Sheet32.Cells(TotalLine, 4) = Worksheets(i).Cells(j, 2)
End If
If (Worksheets(i).Cells(j, 3) = "/") Then
Sheet32.Cells(TotalLine, 5) = "0"
Else
Sheet32.Cells(TotalLine, 5) = Worksheets(i).Cells(j, 3)
End If
Sheet32.Cells(TotalLine, 6) = Sheet32.Cells(TotalLine, 4) + Sheet32.Cells(TotalLine, 5)
End If
Next j
Next i
'清空上次统计信息
Sheet33.Range("A2:F301").ClearContents
'任务行数
Dim TaskLine As Integer
TaskLine = 1
'本条记录是否添加
Dim bFind As Boolean
'效率低下的循环
For i = 2 To TotalLine
bFind = False
For j = 2 To TaskLine
If (Sheet32.Cells(i, 1) = Sheet33.Cells(j, 1) And Sheet32.Cells(i, 2) = Sheet33.Cells(j, 2)) Then
Sheet33.Cells(j, 4) = Sheet33.Cells(j, 4) + Sheet32.Cells(i, 4)
Sheet33.Cells(j, 5) = Sheet33.Cells(j, 5) + Sheet32.Cells(i, 5)
Sheet33.Cells(j, 6) = Sheet33.Cells(j, 6) + Sheet32.Cells(i, 6)
bFind = True
Exit For
End If
Next j
If (Not bFind) Then
TaskLine = TaskLine + 1
Sheet33.Cells(TaskLine, 1) = Sheet32.Cells(i, 1)
Sheet33.Cells(TaskLine, 2) = Sheet32.Cells(i, 2)
Sheet33.Cells(TaskLine, 3) = Sheet32.Cells(i, 3)
Sheet33.Cells(TaskLine, 4) = Sheet32.Cells(i, 4)
Sheet33.Cells(TaskLine, 5) = Sheet32.Cells(i, 5)
Sheet33.Cells(TaskLine, 6) = Sheet32.Cells(i, 6)
End If
Next i
MsgBox ("任务完成咯 :)")
End Sub
Jboss4.x Soap and JDK6
在JDK6下运行Jboss4.x的web service时,会报下面的错误:
java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage
原因在于:
1、Jboss4.x是在JDK5下开发的
2、JDK6调整了SOAPMessage,setProperty要被强制重载
3、这样,在JDK6下运行Jboss4.x的程序,就会报上面的错误
解决方案:
强制使用JBoss endorsed目录下的lib
-Djava.endorsed.dirs=$JBOSS_HOME/lib/endorsed
jnlp的SingleInstanse
//实现SingleInstanceListener接口
class SISListener implements SingleInstanceListener
{
public void newActivation(String[] params)
{
//处理传入参数
}
}
//获取服务
SingleInstanceService sis;
try
{
sis = (SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService");
}
catch (UnavailableServiceException e)
{
sis=null;
}
//程序启动时注册SingleInstanceListener SISListener sisL = new SISListener(); sis.addSingleInstanceListener(sisL);
//程序退出时移除SingleInstanceListener sis.removeSingleInstanceListener(sisL); System.exit(0);
CMD常用命令10用户交互判断重新运行或直接运行
::Hansen ::2012-02-22 @call Clean.bat @call SetEnv.bat @title XXXX :RunHere @cls @xxxxxxxxxxxx @echo 运行完毕 :StartInput @set /p var=重新运行(R)还是退出(E)? @if /i "%var%"=="E" exit() @if /i "%var%"=="R" (goto RunHere) @echo 输入错误,请重试! @goto StartInpu
CMD常用命令09设置Java的ClassPath
::Hansen
::2012-02-22
::Set ClassPath
@echo off
for %%i in ("lib/*.jar") do call :appendPath %%i
goto pathOK
:appendPath
set CLASSPATH=%CLASSPATH%;lib/%1
goto :eof
:pathOk
@echo on
Applet自签名
1、修改Applet主Jar包的Manifest文件,添加下面几行,然后重新打包
Application-Name: AppletTest Implementation-version: 1.0 Application-Library-Allowable-Codebase: * Permissions: sandbox Caller-Allowable-Codebase: * localhost 127.0.0.1
2、生成keystore及key
#生成私钥 keytool -validity 10000 -genkey -alias xxxxxx -keypass xxxxxx -storepass xxxxxx -keystore xxxxxx.jks -dname "CN=(R&D),O=(ATS),C=(CN)" -keyalg RSA
导出证书
#证书DER格式 keytool -exportcert -alias xxxxxx -keypass xxxxxx -keystore xxxxxx.jks -storepass xxxxxx -file xxxxxx.der #证书PEM格式 keytool -exportcert -alias xxxxxx -keypass xxxxxx -keystore xxxxxx.jks -storepass xxxxxx -rfc -file xxxxxx.pem
枚举证书
keytool -list -keystore xxxxxx.jks
3、签名
jarsigner -keystore xxxxxx.jks -storepass xxxxxx -keypass xxxxxx xxxxxx.jar xxxxxx
4、验证
JARsigner -verbose -verify xxxxxx.jar
5、信任签名证书,下面两种方式用一种就好了
5.1、导入CA证书(按用OS登录户全局,自签名Jar)
#下面的方式,与java控制面板导入证书效果相同 #win7 keytool -import -trustcacerts -keystore "%userprofile%\AppData\LocalLow\Sun\Java\Deployment\security\trusted.certs" -alias "" -file XXXXXX.cer -storepass "" -noprompt #winxp keytool -import -trustcacerts -keystore "%APPDATA%\Sun\Java\Deployment\security\trusted.certs" -alias "" -file XXXXXX.cer -storepass "" -noprompt
5.2、导入CA证书(按JDR/JRE全局,自签名Jar)
keytool -import -trustcacerts -file XXXXXX.der -alias NMyCA1024 -keystore %JRE_HOME%\lib\security\cacerts -storepass changeit
6、如果自签名证书还是不行的话
到java控制面板,安全中,把你的网站添加到信任列表就好了。
Jar包签名
1、生成keystore及key
#生成私钥 keytool -validity 10000 -genkey -alias xxxxxx -keypass xxxxxx -storepass xxxxxx -keystore xxxxxx.jks -dname "CN=(R&D),O=(ATS),C=(CN)" -keyalg RSA
导出证书
#证书DER格式 keytool -exportcert -alias xxxxxx -keypass xxxxxx -keystore xxxxxx.jks -storepass xxxxxx -file xxxxxx.der #证书PEM格式 keytool -exportcert -alias xxxxxx -keypass xxxxxx -keystore xxxxxx.jks -storepass xxxxxx -rfc -file xxxxxx.pem
枚举证书
keytool -list -keystore xxxxxx.jks
2、签名
jarsigner -keystore xxxxxx.jks -storepass xxxxxx -keypass xxxxxx xxxxxx.jar xxxxxx
3、验证
JARsigner -verbose -verify xxxxxx.jar
C#调用cdll指针参数处理
1、API声明(包括**参数)
int GetTheLastErrorA(char **pcError); int GetTheLastErrorW(wchar_t **pwError);
2、C#代码
using System.Runtime.InteropServices;
[DllImport("StringAW.dll", CallingConvention = CallingConvention.Winapi,
CharSet = CharSet.Ansi, EntryPoint = "GetTheLastErrorA")]
extern static int GetTheLastErrorA(ref IntPtr a);
[DllImport("StringAW.dll", CallingConvention = CallingConvention.Winapi,
CharSet = CharSet.Auto, EntryPoint = "GetTheLastErrorW")]
extern static int GetTheLastErrorW(ref IntPtr w);
IntPtr a = IntPtr.Zero;
GetTheLastErrorA(ref a);
String sa = Marshal.PtrToStringAnsi(a);
MessageBox.Show(sa);
IntPtr w = IntPtr.Zero;
GetTheLastErrorW(ref w);
String sw = Marshal.PtrToStringUni(w);
MessageBox.Show(sw);