zoukankan      html  css  js  c++  java
  • COM组件和调用详细教程

    一、引言


    实验目的:

    构建一个com组件,该组件存储了10000个12位的验证码;输入一个验证码,组件返回该验证码是否正确(是否是10000个其中之一);输入一个字符串,返回一个对应的映射的验证码(映射方法自己定义)。

    二、环境

    • Windows 10 ×64
    • Visual Studio 2015
    • IDEA 2018.1.5
    • jacob-1.19

    三、实验步骤


    1.C#写com组件

    以管理员身份运行VS
    新建->项目->Visual C#->选择【类库】,名称自定义:MyComToJava,点击【确定】

     
     

    重命名cs文件:MyComToJava.cs,可自定义。弹窗选择【是】

     
     

    右键点击工程->属性->应用程序->程序集信息->“使程序集COM可见(M)”打上勾,点击【确定】

     
     
     
     
     
     

    生成->“为COM互操作注册(C)”打上勾,保存

     
     

    签名->“为程序集签名(A)”打上勾->新建签名MyComToJava->取消勾选“使用密码保护密钥文件”,点击【确定】,保存

     
     

    通过点击工具->创建 GUID->选择5->新建 GUID->复制->替换C#代码中的两个 GUID 值

     
     
     
     

    C#代码:C#代码中必须定义了接口,才可以按照此方法实现调用。一定要写ProgId。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyComToJava
    {
        [Guid("E2032C8D-2E32-4415-8E8C-CFACBCAAADF3")]
        public interface IVerifyCode
        {
            string CheckVerifyCode(string str);
    
            string StrToVerifyCode(string str);
    
            string GetVerifyCode(int i);
        }
        [Guid("BF4EFCF8-8F67-46F2-A84F-E88C8C3DD7A7"),ClassInterface(ClassInterfaceType.None)]
        [ProgId("MyComToJava.Application")]
        public class VerifyCode : IVerifyCode
        {
            int number = 10;
            int length = 12;
            List<string> list;
    
            public VerifyCode()
            {
                list = new List<string>();
                CreateVerifyCode(number,length);
            }
    
            //生成10000个12位的验证码
    
            public List<string> CreateVerifyCode(int number,int length)
            {   
                while (list.Count < number)
                {
                    String code = getRandom(length);
                    if (!list.Contains(code))
                    {
                        list.Add(code);
                    }
                }
                return list;
            }
    
            private static string getRandom(int length)
            {
                Random rand = new Random();
                string validateStr = "";
                char[] validateChar = new char[] {'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' };
    
    
                for (int i=0;i < length; i++)
                {
                    int num = rand.Next(0, 36);
                    validateStr += validateChar[num].ToString();
                    //validateStr += rand.Next(0, 9).ToString();
                }
                return validateStr;
            }
    
            public string CheckVerifyCode(string str)
            {
                if (list.Contains(str))
                {
                    return "验证码正确";
                }
                else
                {
                    return "验证码错误";
                }
            }
    
            public string StrToVerifyCode(string str)
            {
                string validateStr = "";
                if (str.Length < length)
                {
                    validateStr = str;
                    for(int i=0;i<length - str.Length; i++)
                    {
                        validateStr += '0'.ToString();
                    }
                }
                else
                {
                    for(int i = 0; i < length; i++)
                    {
                        validateStr += str[i].ToString();
                    }
                }
                return validateStr;
            }
    
            public string GetVerifyCode(int i)
            {
                return list[i];
            }
        }
    }
    

    编译生成解决方案,Debug目录中会生成MyComToJava.dll文件
    注:生成时平台必须使用x64,不然java会编译错误。

     
     
     
     

    注册COM组件至系统:
    开始菜单->打开VS 2015自带CMD命令窗口(管理员权限)->定位至MyComToJava.dll文件夹下 。
    执行:gacutil /i MyComToJava.dll 添加dll至全局缓存 ;
    执行:regasm MyComToJava.dll 注册dll至系统 。

     
     

    查看注册表regedit,HKEY_CLASSES_ROOT中是否有MyComToJava.VerifyCode项。如果有,则说明注册COM成功;如果没有,请重新注册

     
     
     
     
    2.Java调用com

    IDEA新建Java项目:VerifyCodeComToJava
    右键项目->点击“Open Module Settings”->选择【Modules】->在右侧的Dependencies中点击“+”,选择“JARs OR directories...”->选择jacob.jar所在文件夹,点击【OK】

     
     

    编辑类VerifyCode,代码如下:

    package com.verifycodecomtojava;
    
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.Dispatch;
    import com.jacob.com.Variant;
    
    import java.util.Scanner;
    
    public class VerifyCode {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            try{
                ActiveXComponent dotnetCom = null;
                //需要调用的C#代码中的命名空间名和类名
                dotnetCom = new ActiveXComponent("MyComToJava.Application");
                System.out.println("连接成功");
    
                int choose;
                Scanner input = new Scanner(System.in);
    
                System.out.println("1.判断验证码是否正确");
                System.out.println("2.获取字符串对应的映射的验证码");
    
                while(true) {
                    System.out.println("请选择要进行的操作:");
                    choose = input.nextInt();
                    if(choose == 1){
    //                    Variant var0 = Dispatch.call(dotnetCom, "GetVerifyCode", 0);
    //                    String str0 = var0.toString();
    //                    System.out.println("组件中的第一位验证码:"+str0);
    
                        System.out.println("请输入12位验证码:");
                        String code = input.next();
                        //需要调用的方法名和参数值
                        Variant var = Dispatch.call(dotnetCom, "CheckVerifyCode", code);
                        //返回需要的字符串
                        String str  = var.toString();
                        System.out.println(str);
                    }
                    else if(choose ==2){
                        System.out.println("请输入字符串:");
                        String str = input.next();
                        //需要调用的方法名和参数值
                        Variant var = Dispatch.call(dotnetCom, "StrToVerifyCode", str);
                        //返回需要的字符串
                        String str2  = var.toString();
                        System.out.println(str2);
                    }
                    else{
                        System.out.println("无效操作!");
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    

    最后,运行VerifyCode.java。

    四、实验结果


    1.选择操作“1.判断验证码是否正确”时,输入验证码

     
     

    2.选择操作“2.获取字符串对应的映射的验证码”时,输入字符串,显示该字符串对应的映射的验证码

     


    作者:Txue
    链接:https://www.jianshu.com/p/be7f61ba7c86
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    使用Perl5获取有道词典释义
    Compress a Folder/Directory via Perl5
    为该目录以及子目录添加index.html
    学习Perl6: slice fastq file
    Javascript Regexp match and replace
    赋值运算符函数
    扑克牌顺子
    翻转单词顺序VS左旋转字符串
    和为S的两个数字VS和为S的连续正数序列
    数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/bingru/p/13725427.html
Copyright © 2011-2022 走看看