📄 jcomgenerator.java
字号:
import jp.ne.so_net.ga2.no_ji.jcom.*;
import java.io.*;
import java.util.*;
import java.text.DateFormat;
/**
巜掕偟偨ProgID偺Java-COM僽儕僢僕傪惗惉偡傞僋儔僗丅
COM偲Java偺奣擮揑側懳墳
ITypeLib package
ITypeInfo class
儊僜僢僪 儊僜僢僪
*/
public class JComGenerator {
// 惗惉慜偵愝掕偡傞傕偺
protected String outdirs = null; // 弌椡僨傿儗僋僩儕"..\.."
protected String packagePath = null; // 僷僢働乕僕偺僷僗"jp.ne.so_net.ga2.no_ji.jcom"
protected String progID = null; // ProgID
protected ITypeInfo entryInfo = null; // ProgID偱巜掕偝傟偨宆忣曬
// 惗惉拞偵曄傢傞儌僲
protected String currentPackageName = null; // 尰嵼偺僷僢働乕僕柤"Excel"
protected ITypeLib currentLib = null; // 尰嵼偺儔僀僽儔儕
protected ITypeInfo currentInfo = null; // 尰嵼偺宆忣曬
public void setOutDirs(String outdirs) { this.outdirs = outdirs; }
public void setPackagePath(String packagePath) { this.packagePath = packagePath; }
/**
僷僢働乕僕柤 "jp.ne.so_net.ga2.no_ji.jcom.Excel"偲弌椡僨傿儗僋僩儕"..\.."偐傜
..\..\jp\ne\so_net\ga2\no_ji\jcom\Excel"傪曉偡丅
*/
public String getPath(String packagename) {
String path = outdirs;
if(packagename != null) {
if(path.length() > 0 && ! path.endsWith(File.separator))
path += File.separator;
path += packagename.replace('.', File.separatorChar); // '\\'
}
return path;
}
/**
僨傿儗僋僩儕傪嶌傞丅暋悢僨傿儗僋僩儕懳墳
*/
public boolean makedirs(String packagename) {
return (new File(getPath(packagename))).mkdirs();
}
/**
僼傽僀儖柤傪曉偡丅
僷僢働乕僕柤 "jp.ne.so_net.ga2.no_ji.jcom.Excel"偲弌椡僨傿儗僋僩儕"..\.."偲
僋儔僗柤"Application"偐傜
..\..\jp\ne\so_net\ga2\no_ji\jcom\Excel\Application.java"傪曉偡丅
*/
public String getFilename(String packagename, String classname) {
String path = getPath(packagename);
return path + File.separator + classname + ".java";
}
/**
TYPEATTR.typekind 偵傛傝丄応崌暘偗
*/
public boolean generate(ITypeInfo info) {
currentInfo = info;
try {
ITypeInfo.TypeAttr attr = info.getTypeAttr();
// 偡傋偰偼僒億乕僩偟偰偄側偄丅(;_;)
switch(attr.getTypeKind()) {
case ITypeInfo.TypeAttr.TKIND_ENUM: return generateEnum(info);
case ITypeInfo.TypeAttr.TKIND_DISPATCH: return generateDispatch(info);
case ITypeInfo.TypeAttr.TKIND_COCLASS: return generateCoClass(info);
case ITypeInfo.TypeAttr.TKIND_RECORD:
case ITypeInfo.TypeAttr.TKIND_MODULE:
case ITypeInfo.TypeAttr.TKIND_INTERFACE: // 3
case ITypeInfo.TypeAttr.TKIND_ALIAS:
case ITypeInfo.TypeAttr.TKIND_UNION:
// return generateNoSupport(info);
System.out.print(" @@@ 枹懳墳 TypeKind="+attr.getTypeKind());
break;
default:
System.out.print(" @@@@偆偦丠両 "+attr.getTypeKind());
}
return true;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
/**
僼傽僀儖僿僢僟傪弌椡
*/
void outHeader(PrintWriter out, String packagename) {
// 尰嵼擔帪傪庢摼丅
Date now = Calendar.getInstance().getTime();
String nowstr = DateFormat.getDateTimeInstance().format(now);
out.println("// generated by "+this.getClass().toString()+" at "+nowstr);
out.println("// JCom 2.20 URL=http://www02.so-net.ne.jp/~no-ji");
if(packagename!=null) out.println("package "+packagename+";");
out.println();
out.println("import jp.ne.so_net.ga2.no_ji.jcom.*;");
out.println();
}
/**
僒億乕僩偝傟偰偄側偄僞僀僾偺僀儞僞乕僼僃乕僗傪惗惉偟傑偡丅
TYPEATTR.typekind 偑 TKIND_???? 偺儌僲偵懳偟偰惗惉
僨僶僢僌梡偵弌椡偟傑偡丅
*/
public boolean generateNoSupport(ITypeInfo info) {
String packagename = currentPackageName;
try {
String[] docs = info.getDocumentation(-1);
// 僼傽僀儖傪僆乕僾儞
makedirs(packagename);
String fname = getFilename(packagename, docs[0]);
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(fname)));
// 僼傽僀儖僿僢僟傪弌椡
outHeader(out, packagename);
// 弌椡
ITypeInfo.TypeAttr attr = info.getTypeAttr();
out.println("@@@ 枹懳墳 TypeKind="+attr.getTypeKind());
switch(attr.getTypeKind()) {
case ITypeInfo.TypeAttr.TKIND_ENUM: out.print("TKIND_ENUM"); break;
case ITypeInfo.TypeAttr.TKIND_DISPATCH: out.print("TKIND_DISPATCH"); break;
case ITypeInfo.TypeAttr.TKIND_RECORD: out.print("TKIND_RECORD"); break;
case ITypeInfo.TypeAttr.TKIND_MODULE: out.print("TKIND_MODULE"); break;
case ITypeInfo.TypeAttr.TKIND_INTERFACE: out.print("TKIND_INTERFACE"); break;
case ITypeInfo.TypeAttr.TKIND_COCLASS: out.print("TKIND_COCLASS"); break;
case ITypeInfo.TypeAttr.TKIND_ALIAS: out.print("TKIND_ALIAS"); break;
case ITypeInfo.TypeAttr.TKIND_UNION: out.print("TKIND_UNION"); break;
}
// 僼傽僀儖傪暵偠傞
out.close();
return true;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
/**
楍嫇宆偺僋儔僗傪惗惉偟傑偡丅
TYPEATTR.typekind 偑 TKIND_ENUM 偺儌僲偵懳偟偰惗惉
varkind 偑 VAR_CONST 偺傕偺偟偐懳墳偟偰偄傑偣傫偑丄
Excel偺応崌丄幚幙偦傟偟偐側偄傛偆偱偡丅
@param outdir 弌椡僷僗柤(\側偟)
*/
public boolean generateEnum(ITypeInfo info) {
String packagename = currentPackageName;
try {
String[] docs = info.getDocumentation(-1);
// 僼傽僀儖傪僆乕僾儞
makedirs(packagename);
String fname = getFilename(packagename, docs[0]);
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(fname)));
// 僼傽僀儖僿僢僟傪弌椡
outHeader(out, packagename);
// 娭悢僿僢僟傪弌椡
out.println("/**");
out.println("\tEnum "+docs[0]+((docs[1]!=null)?docs[1]:""));
out.println("\t"+docs[3]+" "+docs[2]);
out.println("*/");
out.println("public class "+docs[0]+" {");
// 昗弨偺儊儞僶傪弌椡
ITypeInfo.TypeAttr attr = info.getTypeAttr();
// 娭悢傪弌椡
if(attr.getFuncs()!=0) {
out.print("Enum偵偼娭悢偼側偄傫偠傖側偄偺丠");
return false;
}
for(int f=0; f<attr.getVars(); f++) {
ITypeInfo.VarDesc vardesc = info.getVarDesc(f);
ITypeInfo.ElemDesc elemVar = vardesc.getVar();
String[] names = vardesc.getNames();
Object value = vardesc.getValue();
switch(vardesc.getVarKind()) {
case ITypeInfo.VarDesc.VAR_CONST: // 2
out.println("\tpublic static final "+getJavaType(elemVar.toString())+" "+ names[0]+" = "+value+";");
break;
case ITypeInfo.VarDesc.VAR_PERINSTANCE: // 0
case ITypeInfo.VarDesc.VAR_STATIC: // 1
case ITypeInfo.VarDesc.VAR_DISPATCH: // 3
out.print("\t/* @@@ 枹懳墳 Enum "+vardesc.toString()+" */");
break;
}
}
out.println("}");
// 僼傽僀儖傪暵偠傞
out.close();
return true;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
// TYPEATTR.typekind 偑 TKIND_DISPATCH 偺儌僲偵懳偟偰惗惉
public boolean generateDispatch(ITypeInfo info) {
String packagename = currentPackageName;
// 僼傽僀儖柤偼
try {
String[] docs = info.getDocumentation(-1);
// 僼傽僀儖傪僆乕僾儞
makedirs(packagename);
String fname = getFilename(packagename, docs[0]);
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(fname)));
// 僼傽僀儖僿僢僟傪弌椡
outHeader(out, packagename);
// 僋儔僗僿僢僟傪弌椡
out.println("/**");
out.println("\tDispatch "+docs[0]+((docs[1]!=null)?docs[1]:""));
out.println("\t"+docs[3]+" "+docs[2]);
String formalProgID = null;
if(info.equals(entryInfo)) { // ProgID丄CLSID傪昞帵
GUID CLSID = Com.getCLSIDFromProgID(progID);
formalProgID = Com.getProgIDFromCLSID(CLSID);
out.println("\tProgID="+formalProgID);
out.println("\tCLSID="+CLSID);
}
out.println("*/");
out.println("public class "+docs[0]+" extends IDispatch {");
// 昗弨偺儊儞僶傪弌椡丅interface ID
ITypeInfo.TypeAttr attr = info.getTypeAttr();
out.println("\t/**");
out.println("\t\t僀儞僞乕僼僃乕僗俬俢偱偡丅");
out.println("\t\t@see\tGUID");
out.println("\t*/");
out.println("\tpublic static GUID IID = GUID.parse(\""+attr.getIID().toString()+"\");");
out.println();
// ProgID偐傜偺僄儞僩儕偑壜擻側偲偒丄
if(info.equals(entryInfo)) {
out.println("\t/**");
out.println("\t\tProgID偐傜惗惉偟傑偡丅");
out.println("\t*/");
out.println("\tpublic "+docs[0]+"(ReleaseManager rm) throws JComException {");
out.println("\t\tsuper(rm, \""+formalProgID+"\");");
out.println("\t}");
out.println();
}
// 昗弨偺儊儞僶傪弌椡丅IDispatch偐傜偺惗惉
out.println("\t/**");
out.println("\t\tIDispatch偐傜惗惉丅栠傝抣偐傜惗惉偡傞偲偒偵巊梡");
out.println("\t*/");
out.println("\tpublic "+docs[0]+"(IDispatch disp) { super(disp); }");
out.println();
// 娭悢傪弌椡
nextroop:
for(int f=0; f<attr.getFuncs(); f++) {
ITypeInfo.FuncDesc funcdesc = info.getFuncDesc(f);
ITypeInfo.ElemDesc elemFunc = funcdesc.getFunc();
ITypeInfo.ElemDesc[] elemParams = funcdesc.getParams();
String[] names = funcdesc.getNames();
// IDispatch埲奜偺娭悢傪惗惉偡傞丅QueryInterface()側偳偼偄傜側偄
if(isIDispatchFunction(names[0])) continue nextroop;
// 娭悢僿僢僟傪惗惉丅側傞傋偔丄懡偔偺忣曬傪弌椡偟偰傗傞丅
out.print("\t/**\n");
out.print("\t\t"+funcdesc.toString()+"\n");
String[] funcdocs = info.getDocumentation(funcdesc.getMemID());
if(funcdocs != null) {
out.print("\t\t");
if(funcdocs[0]!=null) out.print(funcdocs[0]+" ");
if(funcdocs[1]!=null) out.print(funcdocs[1]+" ");
if(funcdocs[2]!=null) out.print(funcdocs[2]+" ");
if(funcdocs[3]!=null) out.print(funcdocs[3]+" ");
out.print("\n");
}
out.print("\t*/\n");
String flagname = "";
switch(funcdesc.getInvokeKind()) {
case ITypeInfo.FuncDesc.INVOKE_FUNC:
flagname = "IDispatch.METHOD";
break;
case ITypeInfo.FuncDesc.INVOKE_PROPERTYGET:
flagname = "IDispatch.PROPERTYGET";
break;
case ITypeInfo.FuncDesc.INVOKE_PROPERTYPUT:
flagname = "IDispatch.PROPERTYPUT";
break;
case ITypeInfo.FuncDesc.INVOKE_PROPERTYPUTREF:
out.print("\t// @@@ 枹懳墳 INVOKE_PROPERTYPUTREF\n");
continue nextroop; // 師偺張棟傊
// flagname = "IDispatch.PROPERTYPUTREF";
// break;
}
// 偙偺儔僀僽儔儕埲奜偺僐儞億乕僱儞僩傪巊偭偰偄側偄偐丠
if(containStranger(funcdesc)) {
out.print("\t// @@@ 枹懳墳 奜晹偺儔僀僽儔儕偺僐儞億乕僱儞僩傪娷傫偱偄傑偡\n");
continue nextroop;
}
// 儊僜僢僪愰尵晹
out.print("\tpublic "+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); // 柤慜偑側偄偲偒偼 "_0"偵
out.print(getJavaType(elemParams[p].getTypeDesc())+" "+argname);
if(p==elemParams.length-1)
out.print(") throws JComException {\n");
else {
out.print(", ");
// 俆偮偛偲偵夵峴傪偄傟偰傗傞丅彫偝側怱尛偄丅
if(p%5==4) out.print("\n\t\t\t\t\t");
}
// 偦偺宆偺恎尦傪愻偆
checkUserDefined(info, elemParams[p].getTypeDesc());
}
}
else {
out.println(") throws JComException {");
}
// 堷悢傪曄姺丄屇傃弌偡
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}");
// 栠傝抣偺宆偺恎尦傪愻偆
checkUserDefined(info, elemFunc.getTypeDesc());
}
out.println("}");
// 僼傽僀儖傪暵偠傞
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -