windows - Delphi/Amazon S3 exe ikke bagudkompatibel

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette en simpel directory watcher for at overvåge en mappe og flytte nye filer, der opfylder bestemte kriterier for en Amazon S3 bucket. Det har til formål at gøre filer oprettet af fjernsystemer til rådighed straks til udgivelse til en hjemmeside. Vi har mange bidragsydere, der bruger en række Windows-versioner, så kompatibilitet er afgørende. I koncept er det nok den mest avancerede kodning jeg har hidtil forsøgt med Delphi.


Hidtil har jeg aldrig oplevet problemer med at flytte .exe-filer mellem Windows 10, Windows 7, Vista og XP. Jeg bruger Delphi XE4, som kun tillader mig at bygge til Win32 platforme. Min udviklings-pc er Windows 10. Jeg bygger med Link Runtime Packages=False.


Exe registrerer og uploader filer på Windows 10-pc'er, men løber ikke under XP/Vista/Windows 10. Det giver fejl i hukommelsesbrud så snart en S3-upload er startet - eller (på XP) sættes der der ikke noget.


Jeg troede, at det var noget at gøre med Data.Cloud.AmazonAPI, IPPeerCommon eller IndyPeerImpl-enhederne, fordi der ikke er noget andet i min kode, som jeg ikke har transporteret på tværs af Windows-versioner succesfuldt før.


Jeg har lavet en enklere version af koden (vedhæftet) for at udforske problemet. Fjernelse af undtagelsesbehandling Jeg får meddelelsen 'Den delte nøgle kan ikke oprettes. Kontrollér, at du har de nødvendige OpenSSL-biblioteker', der forekommer på TAmazonStorageService.Create.


Jeg tror, ​​at jeg har nået grænsen for min viden og erfaring med denne. Jeg kan ikke se OpenSSL-pakker i Delphi-distributionen. Hvordan får jeg dette til at køre på XP/Vista/Windows 7? Mangler jeg nogle DLL'er et sted?


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:UserswowDocumentsfile.txt');
if UploadToS3(b, 'file.txt', 'bucket\_name') then  showmessage('1') else  showmessage('0');
end;

end.

Bedste reference