您的位置:首页 > 编程语言 > Delphi

转 关于delphi调用.net com的详细过程 3desj加密

2007-09-22 14:45 351 查看
delphi调用.net 下的一个过程,.但是不会,找到我,我也觉得以前没有弄过,所以我 就到处找资料,找到后但都不是很全,摸索了几个小时,终于调通了,把过程给大家分享一下

这个是com的主体文件


using System;


using System.Runtime.InteropServices;


using System.IO;


using System.Text;




using System.Security.Cryptography;


// 3desj加密


namespace _des




...{




[Guid("8B090A3D-9A44-4be6-9971-C7DFF9E111BB")]


//这个Guid 用工具---genguid 注册 生成一个系统没有用的值


public interface DBCOM_Interface




...{


[DispId(1)]


string DES3Encrypt(string strString, string strKey);


[DispId(2)]


string DES3Decrypt(string strString, string strKey);


[DispId(3)]


void Encrypt(ref byte[] Data, Int32 DataLen, byte[] Key);


}




// Events interface Database_COMObjectEvents


[Guid("356D756C-0E42-49d6-A646-AACF7B5B04A9"),


InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]


public interface DBCOM_Events




...{


}






[Guid("13045E25-F5F7-428c-8824-F36120195B97"),


ProgId("ClassNamespace._des"),


ClassInterface(ClassInterfaceType.None),


ComSourceInterfaces(typeof(DBCOM_Events))]


public class DBCOM_Class : DBCOM_Interface




...{








public string DES3Encrypt(string strString, string strKey)




...{


TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();


MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();




DES.Key = hashMD5.ComputeHash(Encoding.Default.GetBytes(strKey));




DES.Mode = CipherMode.ECB;


DES.BlockSize = 64;






ICryptoTransform DESEncrypt = DES.CreateEncryptor();




byte[] Buffer = Encoding.Default.GetBytes(strString);


return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));


}




public string DES3Decrypt(string strString, string strKey)




...{


TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();


MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();




DES.Key = hashMD5.ComputeHash(Encoding.Default.GetBytes(strKey)); DES.Mode = CipherMode.ECB;


ICryptoTransform DESDecrypt = DES.CreateDecryptor();


string result = "";


try




...{


byte[] Buffer = Convert.FromBase64String(strString);


result = Encoding.Default.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));


}


catch (System.Exception e)




...{


throw (new System.Exception("null", e));


}


return result;


}










}



这个是Com工程的AssemblyInfo.cs


//主要需要下面两处的改动




[assembly:AssemblyKeyFile("3DES.keys")]


//这个3DES.keys 放到工程主目录下,是用Microsoft .NET Framework SDK v2.0中的bin下的sn.exe 生成的,下面有说明


//主要作用是加一个强名集,做的途中发现必须加这个才能调用








// 将 ComVisible 设置为 false 使此程序集中的类型


// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,


// 则将该类型上的 ComVisible 属性设置为 true。


[assembly: ComVisible(true)]

现在就可以把它生成一个dll文件了,比如叫3des.dll

我们现在需要把这个com注册,和其他开发语言的注册方式不同(如使用regsvr32 ), .net 开发的com注册步骤如下

为了方便,做成一个bat文件

path d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin
sn -k 3des.keys

tlbexp 3des.dll /out:3des.tlb
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/RegAsm /tlb:3des.tlb 3des.dll

gacutil -i 3des.dll

其中 path d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin 表示把查询目录指向这个目录,输入sn等命令是就不用加入这么长的目录标示了,它会自动查找上面的目录的。

sn -k 3des.keys 这个应该在编译dll文件之前执行,生成一个keys, com组件编译必须要这个

RegAsm 3des.dll 表示注册这个com,和 regsvr32 有类似的功能

gacutil -i 3des.dll 映射这个com

可以在windows/assembly/ 下面看有没有3des 这个映射.

这样一个.net 的com就完成了,下面将说delphi 调用的过程


unit Unit1;




interface




uses


Windows, COMOBJ, Activex, Classes, Controls, StdCtrls,


Messages, SysUtils, Variants, Graphics, Forms,


Dialogs;




type


TForm1 = class(TForm)


Button1: TButton;


Edit1: TEdit;


Edit2: TEdit;


Edit3: TEdit;


Edit4: TEdit;


Label1: TLabel;


Label2: TLabel;


lbl2: TLabel;


lbl3: TLabel;


procedure Button1Click(Sender: TObject);


private




{ Private declarations }


public






{ Public declarations }


end;




var


Form1: TForm1;




implementation




{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);


var


SharpObject: Variant;


TestValue: string;


begin


try


try


//这个是调用的String


SharpObject := CreateOleObject('_des.DBCOM_Class');
//这个映射名称 _des.DBCOM_Class 是由上面的com的命令空间名称 .实际接口名称


TestValue := SharpObject.DES3Encrypt(Edit1.Text, Edit2.Text);


Edit3.Text := TestValue;


TestValue := SharpObject.DES3Decrypt(Edit3.Text, Edit2.Text);


Edit4.Text := TestValue;




except


on e: exception do


begin


ShowMessage(e.Message);


end;


end;


finally


SharpObject := Unassigned;


end;






end;




initialization


CoInitialize(nil);




finalization


CoUninitialize;


end.



效果图片



个人体会,如果说delphi做成的com 给.net 调用是一个完美的组合的话,那么反过来就感到十分的别扭了

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Warning 1 Use command line option '/keyfile' or appropriate project settings instead of 'AssemblyKeyFile' E:/WordDir/STCOM/STCOM/Properties/AssemblyInfo.cs 18 12 STCOM

//把这个修改成Bat文件,修改其中的路径名称

/*
path d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin
PAUSE
sn -k E:/WordDir/STCOM/STCOM/bin/Release/keyfile.snk
PAUSE
tlbexp STCOM.dll /out:STCOM.tlb
PAUSE
D:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/RegAsm /tlb:STCOM.tlb STCOM.dll
PAUSE
gacutil -i STCOM.dll
PAUSE
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: