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

📄 collecttypelib.java

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