前端时间写了篇.Net调用Delphi写的COM接口,同一套算法在不同的环境下运行,但后来想了想写成COM,别的程序调用COM效率太低,如果写成标准的DLL也许高些,于是尝试把压缩加密算法写成标准的DLL.
1.在Delphi6中新建一个Dll 扩展,把加密压缩单元引用进来,申明函数

.NET调用非托管程式(标准DLL篇)library CompressDll;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇){ Important note about DLL memory management: ShareMem must be the
.NET调用非托管程式(标准DLL篇)  first unit in your library's USES clause AND your project's (select
.NET调用非托管程式(标准DLL篇)  Project-View Source) USES clause if your DLL exports any procedures or
.NET调用非托管程式(标准DLL篇)  functions that pass strings as parameters or function results. This
.NET调用非托管程式(标准DLL篇)  applies to all strings passed to and from your DLL--even those that
.NET调用非托管程式(标准DLL篇)  are nested in records and classes. ShareMem is the interface unit to
.NET调用非托管程式(标准DLL篇)  the BORLNDMM.DLL shared memory manager, which must be deployed along
.NET调用非托管程式(标准DLL篇)  with your DLL. To avoid using BORLNDMM.DLL, pass string information
.NET调用非托管程式(标准DLL篇)  using PChar or ShortString parameters. }
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)uses
.NET调用非托管程式(标准DLL篇)  SysUtils,
.NET调用非托管程式(标准DLL篇)  Classes,
.NET调用非托管程式(标准DLL篇)  DES in 'DES.pas',
.NET调用非托管程式(标准DLL篇)  uSoapPacketComUnCompressor in 'uSoapPacketComUnCompressor.pas';
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)  procedure CompressData(const sSource : string;out sTarget : string) export; stdcall;
.NET调用非托管程式(标准DLL篇)  begin
.NET调用非托管程式(标准DLL篇)     sTarget := XTToCompressSoapPacket(sSource);
.NET调用非托管程式(标准DLL篇)  end;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)  procedure unCompressData(const sSource : string;out sTarget : string) export; stdcall;
.NET调用非托管程式(标准DLL篇)  begin
.NET调用非托管程式(标准DLL篇)     sTarget := XTToUnCompressSoapPacket(sSource);
.NET调用非托管程式(标准DLL篇)  end;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)  procedure DeCryptData(const sSource, aKey: string;out sTarget : string) export; stdcall;
.NET调用非托管程式(标准DLL篇)  begin
.NET调用非托管程式(标准DLL篇)     sTarget := DeCrypt(sSource,aKey);
.NET调用非托管程式(标准DLL篇)  end;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)  procedure EnCryptData(const sSource, aKey: string;out sTarget : string) export; stdcall;
.NET调用非托管程式(标准DLL篇)  begin
.NET调用非托管程式(标准DLL篇)     sTarget := EnCrypt(sSource,aKey);
.NET调用非托管程式(标准DLL篇)  end;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)  procedure ShowMe(const aStr :array of Byte ;out aData : array of Byte) export ;stdcall;
.NET调用非托管程式(标准DLL篇)  var
.NET调用非托管程式(标准DLL篇)    SysLogFilePath : string;
.NET调用非托管程式(标准DLL篇)    NewLogFile: TFileStream;
.NET调用非托管程式(标准DLL篇)    SysEventLogFile : TextFile;
.NET调用非托管程式(标准DLL篇)    i : integer;
.NET调用非托管程式(标准DLL篇)    a : Byte;
.NET调用非托管程式(标准DLL篇)  begin
.NET调用非托管程式(标准DLL篇)     SysLogFilePath := 'D:\1.log';
.NET调用非托管程式(标准DLL篇)     if not FileExists(SysLogFilePath) then
.NET调用非托管程式(标准DLL篇)     begin
.NET调用非托管程式(标准DLL篇)        NewLogFile := TFileStream.Create(SysLogFilePath, fmCreate or fmShareDenyRead);
.NET调用非托管程式(标准DLL篇)        if Assigned(NewLogFile) then
.NET调用非托管程式(标准DLL篇)           FreeAndNil(NewLogFile);
.NET调用非托管程式(标准DLL篇)     end;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)     AssignFile(SysEventLogFile, SysLogFilePath);
.NET调用非托管程式(标准DLL篇)     try
.NET调用非托管程式(标准DLL篇)        try
.NET调用非托管程式(标准DLL篇)          Append(SysEventLogFile);
.NET调用非托管程式(标准DLL篇)          Writeln(SysEventLogFile,
.NET调用非托管程式(标准DLL篇)                  DateTimeToStr(Now) + aStr);
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)          a := 'd';
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)          aData = aStr + a;
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)        finally
.NET调用非托管程式(标准DLL篇)          CloseFile(SysEventLogFile);
.NET调用非托管程式(标准DLL篇)        end;
.NET调用非托管程式(标准DLL篇)     except
.NET调用非托管程式(标准DLL篇)        on e : exception do
.NET调用非托管程式(标准DLL篇)        begin
.NET调用非托管程式(标准DLL篇)           //抛弃异常
.NET调用非托管程式(标准DLL篇)        end;
.NET调用非托管程式(标准DLL篇)     end;
.NET调用非托管程式(标准DLL篇)      
.NET调用非托管程式(标准DLL篇)  end;
.NET调用非托管程式(标准DLL篇){$R *.res}
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)exports
.NET调用非托管程式(标准DLL篇)   CompressData,unCompressData,DeCryptData, EnCryptData,ShowMe;
.NET调用非托管程式(标准DLL篇)begin
.NET调用非托管程式(标准DLL篇)end.
在Delphi中如下调用,可以通过
.NET调用非托管程式(标准DLL篇)procedure TForm1.BitBtn1Click(Sender: TObject);
.NET调用非托管程式(标准DLL篇)var
.NET调用非托管程式(标准DLL篇)  sSource : string;
.NET调用非托管程式(标准DLL篇)  sTarget : string;
.NET调用非托管程式(标准DLL篇)  LibHandle: THandle;
.NET调用非托管程式(标准DLL篇)  CompressData : TCompressData;
.NET调用非托管程式(标准DLL篇)begin
.NET调用非托管程式(标准DLL篇)   sSource := self.Edit1.Text ;
.NET调用非托管程式(标准DLL篇)   if( sSource  = '') then
.NET调用非托管程式(标准DLL篇)   begin
.NET调用非托管程式(标准DLL篇)      exit;
.NET调用非托管程式(标准DLL篇)   end;
.NET调用非托管程式(标准DLL篇)   LibHandle := LoadLibrary(PChar(UPDATE_DATA_DLL_PATH));
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)  try
.NET调用非托管程式(标准DLL篇)    if LibHandle = HINSTANCE_ERROR then
.NET调用非托管程式(标准DLL篇)       raise EDLLLoadError.Create('Unable to Load DLL');
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)    @CompressData := GetProcAddress(LibHandle, 'CompressData');
.NET调用非托管程式(标准DLL篇)    if not (@CompressData = nil) then
.NET调用非托管程式(标准DLL篇)    begin
.NET调用非托管程式(标准DLL篇)       sTarget := CompressData(sSource);
.NET调用非托管程式(标准DLL篇)       self.Edit2.Text  := sTarget;
.NET调用非托管程式(标准DLL篇)    end;
.NET调用非托管程式(标准DLL篇)  finally
.NET调用非托管程式(标准DLL篇)    {unload the DLL}
.NET调用非托管程式(标准DLL篇)    FreeLibrary(LibHandle);
.NET调用非托管程式(标准DLL篇)  end;
.NET调用非托管程式(标准DLL篇)end;

但是在C#中如下调用,通过查看日志,却把字符串截断了一部分,如果标准DLL返回的不是string类型而是Integer或者是procedure都可以调用成功。希望有高手能指点一二。
.NET调用非托管程式(标准DLL篇)[DllImport("CompressDll.dll",CharSet=CharSet.Unicode,SetLastError=true)]
.NET调用非托管程式(标准DLL篇)        
public static extern void CompressData(string sSource,ref string sTarget);
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)        [DllImport(
"CompressDll.dll",CharSet=CharSet.Unicode,SetLastError=true)]
.NET调用非托管程式(标准DLL篇)        
public static extern void unCompressData(string sSource,ref string sTarget);
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)        [DllImport(
"CompressDll.dll",CharSet=CharSet.Ansi,SetLastError=true)]
.NET调用非托管程式(标准DLL篇)        
public static extern void ShowMe(string aStr,ref string aData);
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)
.NET调用非托管程式(标准DLL篇)        
private void button5_Click(object sender, System.EventArgs e)
        }

源代码:https://files.cnblogs.com/arping/testCOM.rar

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-05
  • 2021-08-10
  • 2021-05-14
  • 2021-10-03
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案