Delphi / Amazon S3 exe不向后兼容

时间:2018-04-27 07:46:23

标签: windows amazon-web-services delphi amazon-s3 compatibility

我正在尝试创建一个简单的目录监视器来监视目录并将符合特定条件的新文件移动到Amazon S3存储桶。其目的是使远程系统创建的文件立即可用于发布到网站。我们有许多贡献者使用一系列Windows版本,因此兼容性至关重要。从概念上讲,这可能是迄今为止我用Delphi尝试过的最先进的编码。

到目前为止,我从未遇到任何在Windows 10,Windows 7,Vista和XP之间移动.exe文件的问题。我正在使用Delphi XE4,它只允许我为Win32平台构建。我的开发PC是Windows 10.我正在构建Link Runtime Packages = False。

exe在Windows 10 PC上检测并上传文件,但不会在XP / Vista / Windows 10下运行。一旦启动S3上传,它就会出现内存冲突错误 - 或者(在XP上)它在那里无所事事。

我认为这与Data.Cloud.AmazonAPI,IPPeerCommon或IndyPeerImpl单元有关,因为我的代码中没有其他任何内容可以在之前成功传输到Windows版本。

我创建了一个更简单的代码版本(附件)来探索这个问题。删除异常处理我收到消息"无法创建共享密钥。请检查您是否拥有所需的OpenSSL库"发生在TAmazonStorageService.Create。

我认为我已经达到了我对这个知识和经验的极限。我无法在Delphi发行版中看到OpenSSL包。如何让它在XP / Vista / Windows 7上运行?我在某处错过了一些DLL吗?

Unit Unit2;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.Cloud.AmazonAPI, Vcl.StdCtrls,System.IOUtils, IPPeerCommon, IndyPeerImpl  ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


function UploadToS3(FileIn: TBytes; FileName: string; Bucket: string): boolean;
var Service: TAmazonStorageService ;
    ConAmazon: TAmazonConnectionInfo;
begin
  try
    ConAmazon := TAmazonConnectionInfo.Create(nil);
    ConAmazon.AccountKey    := 'xxxxxxxxxxxxxxxxxxxxx';
    ConAmazon.AccountName   := 'xxxxxxxxxxxxxxxxxxxxx';
    ConAmazon.QueueEndpoint     := 'xxxxxxxxxxxxxxxxxxxxx';
    ConAmazon.StorageEndpoint   := 'xxxxxxxxxxxxxxxxxxxxx';
    ConAmazon.TableEndpoint     := 'xxxxxxxxxxxxxxxxxxxxx';
    ConAmazon.UseDefaultEndpoints := False;
    Service := TAmazonStorageService.Create(ConAmazon);
    Result := Service.UploadObject(Bucket, FileName, FileIn, TRUE, nil, nil, amzbaPrivate, nil);
  finally
    ConAmazon.Free;
    Service.Free;
  end;
end;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var b:TBytes;
begin

b := TFile.ReadAllBytes('C:\Users\wow\Documents\file.txt');
if UploadToS3(b, 'file.txt', 'bucket_name') then  showmessage('1') else  showmessage('0');
end;

end.

0 个答案:

没有答案