现在的位置: 首页 > 综合 > 正文

.NET调用非托管程式(COM篇)

2012年08月05日 ⁄ 综合 ⁄ 共 2897字 ⁄ 字号 评论关闭

这两天一直在研究用.net 调用非托管dll,项目准备用c#写服务器端的逻辑处理以及WebService,中间采用Soap传输数据,客户端软硬件环境以及网络环境都比较复杂,尽量采用少干预客户端比较好,最终采纳用Delphi写客户端应用程式,毕竟在客户的终端机器上装.net framework太过于庞大,尤其是在配置很低的机器上。当然数据传输就必须有压缩加密的过程,要想在不同语言之间实现同一套压缩算法还是比较麻烦的,于是想出一个比较简单的处理方式,压缩算法采用Dephi自带的ZLIB,加密采用DES然后写成COM。
1.在Delphi中创建一个ActiveX Library Project,再增加一个Automation Object单元,自动帮你创建一个COM接口单元,定义好接口函数,注意返回类型用wideString

unit Compress;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, ZlibCompress_TLB, StdVcl;

type
  TZLibCompress = class(TAutoObject, IZLibCompress)
  protected
    function CompressData(const sData: WideString): WideString; safecall;
    function unCompressData(const sData: WideString): WideString; safecall;
    function DeCryptData(const aStr, aKey: WideString): WideString; safecall;
    function EnCryptData(const aStr, aKey: WideString): WideString; safecall;
    { Protected declarations }
  end;

implementation

uses ComServ,uSoapPacketComUnCompressor,DES;

//==============================================================================
// Compress Data
//==============================================================================
function TZLibCompress.CompressData(const sData: WideString): WideString;
begin
   Result := XTToCompressSoapPacket(sData);
end;

//==============================================================================
// UnCompress Data
//==============================================================================
function TZLibCompress.unCompressData(const sData: WideString): WideString;
begin
   Result := XTToUnCompressSoapPacket(sData);
end;

//==============================================================================
// Decrypt Data
//==============================================================================
function TZLibCompress.DeCryptData(const aStr,
  aKey: WideString): WideString;
begin
   Result := DeCrypt(aStr,aKey);
end;

//==============================================================================
// Encrypt Data
//==============================================================================
function TZLibCompress.EnCryptData(const aStr,
  aKey: WideString): WideString;
begin
   Result := EnCrypt(aStr,aKey);
end;

initialization
  TAutoObjectFactory.Create(ComServer, TZLibCompress, Class_ZLibCompress,
    ciMultiInstance, tmApartment);
end.

2.在.Net项目中引用此COM文件,采用如下方式调用对应的接口

if(this.textBox1.Text == string.Empty)
            
{
                MessageBox.Show(
"null param");
            }


            ZlibCompress.ZlibCompress obj 
= new ZlibCompress.ZlibCompress();
            
try
            
{
                
                
this.textBox2.Text = obj.EnCryptData(this.textBox1.Text,"GURUB2B");
            }

            
catch(Exception ex)
            
{
                MessageBox.Show(ex.Message);
            }

            
finally
            
{
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            }

3.客户端程式不需要调用COM直接引用算法的单元文件即可。

示例代码:http://files.cnblogs.com/arping/testCOM.rar

【上篇】
【下篇】

抱歉!评论已关闭.