⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcomgenerator.java

📁 使用JCom的时候
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -