这两天一直在研究用.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.
{$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);
}
{
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直接引用算法的单元文件即可。
示例代码:https://files.cnblogs.com/arping/testCOM.rar