📄 collecttypelib.java
字号:
break;
}
// 儊僜僢僪愰尵晹
out.print("\t"+getJavaType(elemFunc.getTypeDesc())+" "+names[0]+"(");
if(elemParams != null) {
for(int p=0; p<elemParams.length; p++) {
String argname = (names.length>p+1) ? names[p+1] : ("_"+p); // 柤慜偑側偄偲偒偼 "_1"偵
out.print(getJavaType(elemParams[p].getTypeDesc())+" "+argname);
if(p==elemParams.length-1)
out.print(") {\n");
else {
out.print(", ");
// 俆偮偛偲偵夵峴傪偄傟偰傗傞丅彫偝側怱尛偄丅
if(p%5==4) out.print("\n\t\t\t\t\t");
}
}
}
else {
out.println(") {");
}
// 堷悢傪曄姺丄屇傃弌偡
if(elemParams!=null && elemParams.length>0) {
out.print("\t\tObject[] params = new Object["+(elemParams.length)+"];\n");
for(int i=0; i<elemParams.length; i++) {
out.print("\t\tparams["+i+"] = ");
String argname = (names.length>i+1) ? names[i+1] : ("_"+i); // 柤慜偑側偄偲偒偼 "_1"偵
out.print(generateArgument(elemParams[i], argname)+";\n");
}
out.print("\t\tObject rc = invoke(\""+names[0]+"\", "+flagname+", params);\n");
}
else {
out.print("\t\tObject rc = invoke(\""+names[0]+"\", "+flagname+", null);\n");
}
// return 僗僥乕僩儊儞僩傪弌椡
out.print("\t\t"+generateReturnStatement(elemFunc,"rc")+"\n");
out.println("\t}");
}
}
out.println("}");
// 僼傽僀儖傪暵偠傞
out.close();
return true;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
// TYPEATTR.typekind 偑 TKIND_COCLASS 偺儌僲偵懳偟偰惗惉
public boolean generateCoClass(ITypeInfo info) {
// 僼傽僀儖柤偼
try {
String[] docs = info.getDocumentation(-1);
// 僼傽僀儖傪僆乕僾儞
makedirs();
String fname = getFilename(docs[0]);
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(fname)));
// 僼傽僀儖僿僢僟傪弌椡
outHeader(out);
// 娭悢僿僢僟傪弌椡
out.println("/**");
out.println("\tCoClass "+docs[0]+((docs[1]!=null)?docs[1]:""));
out.println("\t"+docs[3]+" "+docs[2]);
ITypeInfo.TypeAttr attr = info.getTypeAttr();
for(int i=0; i<attr.getImplTypes(); i++) {
ITypeInfo imp = info.getImplType(i);
out.println("\t"+imp.getDocumentation(-1)[0]);
}
out.println("*/");
ITypeInfo impl = info.getImplType(0);
out.println("public class "+docs[0]+" extends "+impl.getDocumentation(-1)[0]+" {");
// 昗弨偺儊儞僶傪弌椡
out.println("\t/**");
out.println("\t\tIDispatch偐傜惗惉丅栠傝抣偐傜惗惉偡傞偲偒偵巊梡");
out.println("\t*/");
out.println("\tpublic "+docs[0]+"(IDispatch disp) { super(disp); }");
out.println();
out.println("}");
// 僼傽僀儖傪暵偠傞
out.close();
return true;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
/**
IDispatch僀儞僞乕僼僃乕僗偱掕媊偝傟偰偄傞娭悢偐偳偆偐傪挷傋傞丅
扨弮偵娭悢柤偱敾抐偟偰偄傞偩偗丅
*/
protected boolean isIDispatchFunction(String funcname) {
String[] fnames = {
"QueryInterface",
"AddRef",
"Release",
"GetTypeInfoCount",
"GetTypeInfo",
"GetIDsOfNames",
"Invoke" };
for(int i=0; i<fnames.length; i++) {
if(funcname.equals(fnames[i])) return true;
}
return false;
}
/**
VARIANT偺宆偐傜Java偺宆偵曄姺
*/
protected String getJavaType(String type) {
if(type.equals("VT_INT")) return "int";
if(type.equals("VT_I4")) return "int";
if(type.startsWith("VT_PTR+VT_USERDEFINED:")) return type.substring("VT_PTR+VT_USERDEFINED:".length());
if(type.equals("VT_R4")) return "float";
if(type.equals("VT_R8")) return "double";
if(type.equals("VT_BSTR")) return "String";
if(type.equals("VT_VOID")) return "void";
if(type.equals("VT_VARIANT")) return "Object";
if(type.equals("VT_BOOL")) return "boolean";
if(type.equals("VT_DISPATCH")) return "IDispatch";
if(type.equals("VT_UNKNOWN")) return "IUnknown";
if(type.equals("VT_DATE")) return "java.util.Date";
// VT_PTR偺側偄VT_USERDEFINED傪Enum偲尒側偟丄Enum傪int偲傒側偡丅偪傚偭偲棎朶偐傕丠
if(type.startsWith("VT_USERDEFINED:")) return "int";
return "@@@"+type;
}
/**
堷悢傪愝掕偡傞売強傪惗惉偡傞
*/
String generateArgument(ITypeInfo.ElemDesc elem, String name) {
String jtype = getJavaType(elem.getTypeDesc());
if(jtype.equals("boolean")) return "new Boolean("+name+")";
if(jtype.equals("int")) return "new Integer("+name+")";
if(jtype.equals("double")) return "new Double("+name+")";
if(jtype.equals("float")) return "new Float("+name+")";
if(jtype.equals("String")) return name;
if(jtype.equals("Object")) return name;
if(elem.getTypeDesc().startsWith("VT_PTR+VT_USERDEFINED:")) return name;
return "@@@"+name;
}
/**
return暥傪惗惉偡傞
*/
String generateReturnStatement(ITypeInfo.ElemDesc elem, String var) {
String jtype = getJavaType(elem.getTypeDesc());
if(jtype.equals("void")) return "return;";
if(jtype.equals("int")) return "return ((Integer)"+var+").intValue();";
if(jtype.equals("double")) return "return ((Double)"+var+").doubleValue();";
if(jtype.equals("float")) return "return ((Float)"+var+").floatValue();";
if(jtype.equals("boolean")) return "return ((Boolean)"+var+").booleanValue();";
if(jtype.equals("Object")) return "return "+var+";";
if(jtype.equals("String")) return "return (String)"+var+";";
if(jtype.equals("java.util.Date")) return "return (java.util.Date)"+var+";";
if(elem.getTypeDesc().startsWith("VT_PTR+VT_USERDEFINED:"))
return "return new "+getJavaType(elem.getTypeDesc())+"((IDispatch)"+var+");";
if(elem.getTypeDesc().equals("VT_DISPATCH"))
return "return (IDispatch)"+var+";";
if(elem.getTypeDesc().equals("VT_UNKNOWN"))
return "return (IUnknown)"+var+";";
return "return "+jtype+"@@@"+var;
}
/**
巊偄曽
*/
public static void usage() {
System.out.println("巜掕偟偨ProgID偺僆僽僕僃僋僩偺僜乕僗傪帺摦惗惉偟傑偡丅");
System.out.println();
System.out.println("巊偄曽: JComGenerator [<options>] <ProgID>");
System.out.println("options");
System.out.println(" -package <packagename> 僷僢働乕僕偵偟傑偡");
System.out.println(" -d <directory> 惗惉偝傟傞僜乕僗僼傽僀儖偺埵抲傪巜掕偟傑偡");
System.out.println();
System.out.println("椺: JComGenerator \"Excel.Application\"");
System.out.println(" 偡傋偰偺僆僽僕僃僋僩偺僜乕僗傪惗惉偟傑偡丅");
System.out.println("椺: JComGenerator \"Excel.Application.8\" jp.ne.so_net.ga2.no_ji.jcom.excel8");
System.out.println(" _Application僆僽僕僃僋僩偺僜乕僗傪惗惉偟傑偡丅");
System.out.println();
System.out.println("戙昞揑側 ProgID 偲 Interface");
System.out.println(" Excel.Application _Application");
System.out.println(" InternetExplorer.Application IWebBrowser");
}
public static void main(String[] args) throws Exception {
// 堷悢夝愅
if(args.length==0) { JComGenerator.usage(); return; }
String packagename = null;
String outdirs = null;
String target = null;
String progID = null;
for(int i=0; i<args.length; i++) {
if(args[i].equals("-package")) {
packagename = args[++i];
}
else if(args[i].equals("-d")) {
outdirs = args[++i];
}
else {
progID = args[i];
}
}
if(progID==null) { JComGenerator.usage(); return; }
JComGenerator generator = new JComGenerator();
generator.setPackage(packagename);
generator.setOutDirs(outdirs);
ReleaseManager rm = new ReleaseManager();
try {
System.out.println(progID+"傪婲摦拞...");
IDispatch xlApp = new IDispatch(rm, progID);
ITypeInfo typeInfo = xlApp.getTypeInfo();
ITypeLib typeLib = typeInfo.getTypeLib();
int infocount = typeLib.getTypeInfoCount();
if(target == null) {
// 偡傋偰偺僐儞億乕僱儞僩傪昞帵丅
for(int i=0; i<infocount; i++) {
ITypeInfo info = typeLib.getTypeInfo(i);
System.out.println(info.getDocumentation(-1)[0]);
generator.generate(info);
}
System.out.println(""+infocount+" file(s)");
}
else {
// 巜掕偟偨僆僽僕僃僋僩傪昞帵丅
for(int i=0; i<infocount; i++) {
ITypeInfo info = typeLib.getTypeInfo(i);
if(info.getDocumentation(-1)[0].equals(target)) {
// System.out.println(info.getDocumentation(-1)[0]);
generator.generate(info);
System.out.println("弌椡偟傑偟偨丅懡暘");
break; // 廔椆
}
}
}
}
catch(Exception e) { e.printStackTrace(); }
finally { rm.release(); }
}
}
/*
"Excel.Sheet"
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -