📄 collecttypelib.java
字号:
import jp.ne.so_net.ga2.no_ji.jcom.*;
import java.io.*;
import java.util.*;
import java.text.DateFormat;
/**
巜掕偟偨ITypeInfo偺Java-COM僽儕僢僕傪惗惉偡傞僋儔僗丅
COM偲Java偺奣擮揑側懳墳
ITypeLib package
ITypeInfo class
儊僜僢僪 儊僜僢僪
*/
public class CollectTypeLib {
protected String packagename = null;
protected String outdirs = null;
public void setPackage(String packagename) { this.packagename = packagename; }
public void setOutDirs(String outdirs) { this.outdirs = outdirs; }
public String getPath() {
String path = "";
if(outdirs != null) {
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() {
return (new File(getPath())).mkdir();
}
public String getFilename(String classname) {
String path = getPath();
return path + File.separator + classname + ".java";
}
/**
TYPEATTR.typekind 偵傛傝丄応崌暘偗
*/
public boolean generate(ITypeInfo 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.println("@@@ 枹懳墳 TypeKind="+attr.getTypeKind());
break;
default:
System.out.println("@@@@偆偦丠両 "+attr.getTypeKind());
}
return true;
}catch(Exception e) { e.printStackTrace(); }
return false;
}
/**
僼傽僀儖僿僢僟傪弌椡
*/
void outHeader(PrintWriter out) {
// 尰嵼擔帪傪庢摼丅
Date now = Calendar.getInstance().getTime();
String nowstr = DateFormat.getDateTimeInstance().format(now);
out.println("// 拲堄丗偙偺僜乕僗偼偡偛偔傾儎僔僀偱偡丅怣梡偟側偄偱偔偩偝偄丅");
out.println("//");
out.println("// generated by "+this.getClass().toString()+" at "+nowstr);
// out.println("// JCom ?.?? URL=http://www02.so-net.ne.jp/~no-ji");
out.println("// JCom ?.?? URL=http://www11.u-page.so-net.ne.jp/ga2/no-ji/jcom/index.htm");
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) {
try {
String[] docs = info.getDocumentation(-1);
// 僼傽僀儖傪僆乕僾儞
makedirs();
String fname = getFilename(docs[0]);
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(fname)));
// 僼傽僀儖僿僢僟傪弌椡
outHeader(out);
// 弌椡
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偺応崌丄幚幙偦傟偟偐側偄傛偆偱偡丅
*/
public boolean generateEnum(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("\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) {
// 僼傽僀儖柤偼
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("\tDispatch "+docs[0]+((docs[1]!=null)?docs[1]:""));
out.println("\t"+docs[3]+" "+docs[2]);
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();
// 昗弨偺儊儞僶傪弌椡丅IDispatch偐傜偺惗惉
out.println("\t/**");
out.println("\t\tIDispatch偐傜惗惉丅栠傝抣偐傜惗惉偡傞偲偒偵巊梡");
out.println("\t*/");
out.println("\tpublic "+docs[0]+"(IDispatch disp) { super(disp); }");
out.println();
// 娭悢傪弌椡
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])) {
// 娭悢僿僢僟傪惗惉丅側傞傋偔丄懡偔偺忣曬傪弌椡偟偰傗傞丅
out.print("\t/*\n");
out.print("\t\t"+funcdesc.toString()+"\n");
String[] funcdocs = info.getDocumentation(f);
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");
flagname = "IDispatch.PROPERTYPUTREF";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -