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

原创 2007年09月22日 14:45:00
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
*/

 

DES/3DES加密,解密

〇、前言:         最近在项目中,涉及到与第三方厂家系统进行对接时,在参数传递过程中考虑到了数据的安全性,故双方采用3DES进行对传递参数的加解密,因此,进一步了解了下3DES的加解密算法,再...
  • xcbeyond
  • xcbeyond
  • 2016年08月07日 01:48
  • 2972

关于delphi调用.net com的详细过程

 由于朋友他必须要用delphi调用.net 下的一个过程,.但是不会,找到我,我也觉得以前没有弄过,所以我 就到处找资料,找到后但都不是很全,摸索了几个小时,终于调通了,把过程给大家分享一下 这个是...
  • li37
  • li37
  • 2006年11月02日 09:24
  • 2761

Delphi 怎么不注册 dll 就调用 com

一.方法 lich (2003-10-30 22:16:00)  前言: 如果你的程序中使用了 COM对象或者 OCX控件, 发布程序的时候必须带上相关的 DLL文件或者 OCX文件, ...
  • love3s
  • love3s
  • 2012年03月10日 17:28
  • 1333

怎样用DELPHI调用COM组件

在Delphi中的话,创建一个工程后,菜单Project下有一个Import   Type   Library选项,     点击进入,选择你用VC编写的dll的Type   Library,将其创建...
  • lee576
  • lee576
  • 2007年11月27日 15:34
  • 7706

delphi7 如何加载com组件

1、通过omponent--Import ActiveX control 导入 USBKeyPnPActiveX.ocx2、通过project-- Import Type Library 导入 BJC...
  • zhangrenhong
  • zhangrenhong
  • 2008年06月19日 11:50
  • 1106

Delphi6调用COM组件的方法

1.调用普通COM组件    Project->Import type library...->选中要调用COM组件->Create Unit ,记住类的名称     var    test : Tx...
  • Pipi0714
  • Pipi0714
  • 2008年09月10日 11:56
  • 2326

.NET调用Com组件事例

在程序设计中,往往通过键盘的某个按键来完成相关操作!  下面就来说明如何实现: 1.引入名称空间;using System.Runtime.InteropServices;(由于使用到API(user...
  • shizhiyingnj
  • shizhiyingnj
  • 2007年02月11日 23:23
  • 7261

Delphi 过程与函数

1.标准过程与标准函数         过程和函数是实现一定功能的语句块,是程序中的特定功能单元,即子程序。         Delphi语言的过程有两种:标准过程与自定义过程。标准过程是系统内部...
  • hailmy
  • hailmy
  • 2013年09月17日 13:45
  • 1340

C/C++通过COM调用.NET托管程序集的实现(转载)

在.NET托管程序集中,调用非托管的win32 dll 可以通过DllImport 或者Interop中的 P/Invoke 技术将非托管dll生成托管的dll来访问;但反过来,如何在非托管环境下(如...
  • silverice
  • silverice
  • 2007年12月30日 10:02
  • 2212

NET中如何引用COM组件

如果您是初次学习.NET,说不定会尝试着去学习怎样使用COM组件,为了让您少走弯路,我把我所遇到的问题写下来,与大家共享。同时也希望与您一起交流,共同提高。联系方式:电话:0571-88021712 ...
  • lvboliang
  • lvboliang
  • 2007年06月05日 21:15
  • 1239
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转 关于delphi调用.net com的详细过程 3desj加密
举报原因:
原因补充:

(最多只允许输入30个字)