COM组件和调用
1、引言
实验内容:构建一个com组件,该组件存储了10000个12位的验证码;输入一个验证码,组件返回该验证码是否正确(是否是10000个其中之一);输入一个字符串,返回一个对应的映射的验证码(映射方法自己定义);
2、实验环境
- 操作系统:Windows 10
- 实验工具:IntelliJ IDEA && vs2015
- 环境:Java jdk 1.8
3、COM组件介绍
- COM不是一种语言,而是一种标准、规范,包括一套标准API、一个标准的接口集以及COM用于支持分布式计算的网络协议。
- COM是软件组件互相通信的一种方式,它是一种二进制和网络标准,允许任意两个组件互相通信,而不管它们在什么计算机上运行(只要计算机是相连的),不管计算机运行的什么操作系统(只要该操作系统支持COM),也不管该组件机是用什么语言编写的。
- COM组件是遵循COM规范编写、以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足对组件架构的所有需求。遵循COM的规范标准,组件与应用、组件与组件之间可以互操作,极其方便地建立可伸缩的应用系统。
- COM是一种技术标准,其商业品牌则称为ActiveX。ActiveX是Microsoft遵循COM/DCOM规范而开发的用于Internet的一种对象连接与嵌入技术(OLE)。ActiveX是从复合文档技术OLE成长以来的。OLE最初发布的版本只是瞄准符合文档,但在OLE2中引入了
COM。一般常用的COM组件有两类:ActiveX DLL和ActiveX 控件 。
4、实验过程
4.1 利用C#创建一个COM组件
4.1.1 项目创建
4.1.2 配置项目属性
4.1.3 编码实现COM组件功能
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Text.RegularExpressions; namespace ComToPython {
[Guid("15EE3DA3-C1E2-4D60-8FAA-CFCEDFAD0F07")] public interface IMyClass {
string Init(); bool VerifyCode(string input); string CodeMapping(string input); } [ClassInterface(ClassInterfaceType.None)] [Guid("214A249F-C0FE-4E71-A3F2-BB60AB8734CA")] [ProgId("ComToPython.Application")] public class ComToPython:IMyClass {
string[] codes = new string[10005]; public string Init() {
//验证码字符 char[] ch = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i','j', 'k','l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; Random random = new Random(); for(int i=0;i<10000;i++) {
codes[i] = ""; for (int j = 0; j < 12; j++) {
int position=random.Next()%62; codes[i] += ch[position]; } } return codes[0]; } public bool VerifyCode(string input) {
for (int i = 0; i < 10000; i++) if (input == codes[i]) return true; return false; } public string CodeMapping(string input) {
string pattern = @"^[A-Za-z0-9]+$"; Regex regex = new Regex(pattern); if (input.Length != 6) return "字符串长度必须为6!"; if (!regex.IsMatch(input)) return "字符串必须由数字和字母组成!"; for (int i = 0; i < 10000; i++) if (codes[i].Substring(0, 6) == input) return "成功匹配验证码:" + codes[i]; return "未能匹配到验证码!"; } } }
4.1.4 新建两个Guid
4.1.5 生成解决方案

到该Visual studio工程下的bin-Debug路径下可以看到生成的文件;

4.2 使用JAVA调用COM组件
4.2.1 注册COM组件至系统
4.2.2 新建java项目,并导入jacob.jar
4.2.3 编写java调用代码并运行
代码如下:
package com.comtojava; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; import java.util.Scanner; public class test {
/ * @param args */ public static void main(String[] args) {
// TODO Auto-generated method stub try{
ActiveXComponent dotnetCom = null; dotnetCom = new ActiveXComponent("ComToPython.Application"); Variant var = Dispatch.call(dotnetCom,"Init"); System.out.println("验证码示例如下:"); System.out.println(var.toString()); System.out.println(); System.out.println("请选择操作:1:输入验证码判断是否正确"); System.out.println("1:输入验证码判断是否正确"); System.out.println("2:输入字符串返回对应的验证码"); System.out.println("输入0退出!"); int choice; Scanner scanner=new Scanner(System.in); choice=scanner.nextInt(); while(choice!=0) {
switch (choice) {
case 1: System.out.println("请输入验证码:"); String testCode=scanner.next(); var = Dispatch.call(dotnetCom,"VerifyCode",testCode); if(var.getBoolean()) System.out.println("该验证码正确!"); else System.out.println("该验证码错误!"); break; case 2: System.out.println("请输入6位由数字和字母(大小写均可)组成的字符串:"); String code=scanner.next(); var = Dispatch.call(dotnetCom,"CodeMapping",code); System.out.println(var.toString()); } System.out.println(); System.out.println("请选择操作:"); choice=scanner.nextInt(); } } catch (Exception ex) {
ex.printStackTrace(); } } }
5、遇到的问题及解决方案
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200552.html原文链接:https://javaforall.net
