實驗內(nèi)容
構(gòu)建一個com組件雇逞,該組件存儲了1000個12位的驗證碼;輸入一個驗證碼燎潮,組件返回該驗證碼是否正確(是否是1000個其中之一)倔丈;輸入一個字符串憨闰,返回一個對應(yīng)的映射的驗證碼(映射方法自己定義);
實驗過程
編寫COM組件并注冊(win10 64位系統(tǒng))
詳細(xì)流程就不說了需五,網(wǎng)上有很多教程鹉动,不過有幾個坑可以記一下:
生成解決方案的時候如果遇到權(quán)限不足的問題,可以參考下面鏈接的操作:
https://blog.csdn.net/esrichinacd/article/details/17021879
https://jingyan.baidu.com/article/54b6b9c08b08382d593b4747.html
生成解決方案的時候用64位的編譯平臺宏邮,不然調(diào)用的時候會報錯
編寫COM組件泽示,用RNGCryptoServiceProvider生成的狀態(tài)碼截取12位存進(jìn)codes(list)里,通過輸入的字符串的值(各個字符相加的值)除1000取余得到的值即為映射的驗證碼在codes中的索引蜜氨。
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace ComToJava //命名空間名稱械筛,根據(jù)自己需要自定義。這里我們?nèi)∶鸆omToJava
{
[Guid("4FEC04C9-4E96-4E42-A02D-4A432E2DFBFA")] //GUID值
public interface IEncrypt //定義接口名
{
bool checkCode(string code);
string getCode(string key);
}
[Guid("F81E55CA-10CD-4DD3-AD8D-5D163CC71FBC"), ClassInterface(ClassInterfaceType.None)] //GUID值
[ProgId("ComToJava.Application")]
public class Encrypt : IEncrypt //類名飒炎,接口名 变姨,必須定義接口
{
List<string> codes;
public Encrypt() {
codes = new List<string>();
RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
for (int i=0;i<1000;i++)
{
byte[] byteCsp = new byte[10];
csp.GetBytes(byteCsp);
string code = BitConverter.ToString(byteCsp).Substring(0, 12);
codes.Add(code);
}
}
public bool checkCode(string code)
{
foreach(string s in codes)
{
if (s.Equals(code))
{
return true;
}
}
return false;
}
public string getCode(string key)
{
int num = 0;
for(int i=0;i<key.Length;i++)
{
num += (int)key[i];
}
return codes[num % 1000];
}
}
}
Java調(diào)用com組件測試
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
ActiveXComponent dotnetCom = null;
dotnetCom = new ActiveXComponent("ComToJava.Application"); //需要調(diào)用的C#代碼中的命名空間名和類名
Variant var = Dispatch.call(dotnetCom, "getCode","xionganshu"); //需要調(diào)用的方法名和參數(shù)值
String str = var.toString(); //返回需要的字符串
System.out.println("my code is "+str);
if(Boolean.valueOf(Dispatch.call(dotnetCom,"checkCode",str).toString())){
System.out.println(str+" exists!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
運(yùn)行結(jié)果