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

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
*/


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zcrong/archive/2007/09/22/1795847.aspx

posted @ 2010-08-23 23:35  kagar  阅读(638)  评论(0编辑  收藏  举报