C ++ Builder 10.3 Rio Amazon Storage Service示例

时间:2019-02-18 03:20:37

标签: amazon-web-services amazon-s3 c++builder c++builder-10.3-rio

我正在尝试移动一个使用C ++ Builder的TAmazonConnectionInfo来访问Amazon Simple Storage Service(S3)上的对象的应用程序。我有一个在C ++ Builder 10.1 Berlin中工作的版本,但是当我尝试将其移至10.3 Rio时,链接失败,并出现一个未解决的外部错误:

  

[ilink32错误]错误:无法解析的外部'__fastcall Data :: Cloud :: Amazonapi :: TAmazonStorageService :: GetObjectW(System :: UnicodeString,System :: UnicodeString,System :: Classes :: TStream *,Data :: Cloud :: Cloudapi :: TCloudResponseInfo *,数据:: Cloud :: Amazonapi :: TAmazonRegion)'

此错误的最简单再现是:

  1. 创建一个新的C ++ Builder VCL应用程序
  2. 在表单上放置一个TAmazonConnectionInfo对象和一个按钮,然后双击该按钮
  3. 将点击处理程序替换为:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        TCloudResponseInfo * ResponseInfo = NULL;
        TAmazonStorageService *StorageService = NULL;
        TStream* stream;
        String ObjectName;
        StorageService->GetObject(ObjectName, ObjectName, stream, ResponseInfo);
    }
    

(我意识到此例程将不起作用,因为未初始化任何内容,但这将以最少的代码量产生链接错误)。

我正在寻找一个代码示例,该代码示例如何工作,但是我无法在系统上找到RAD Studio 10.3 Rio的代码示例,并且看来{{3}上的Rio的示例也没有更新。 }在SourceForge上。

我尝试将CloudService.lib添加到项目中,但这没有帮助。都没有添加:

#pragma link "Data.Cloud.CloudAPI"
#pragma link "Data.Cloud.AmazonAPI"

那么,有没有可以在10.3 Rio下编译和链接的C ++ Builder示例?如何获得该项目的编译和链接?

2 个答案:

答案 0 :(得分:0)

问题是Data.Cloud.AmazonAPI.hpp标头内部包含wingdi.h Windows API标头。此标头具有一个宏,该宏将GetObject替换为GetObjectA/W

我设法解决的方法是将以下内容添加到Data.Cloud.AmazonAPI.hpp标头中,即在#includes结尾处(第27行附近)以下:

#pragma push_macro("GetObject")
#undef GetObject

然后,在标题的末尾,在#pragma delphiheader end.之前(第897行附近)添加以下内容:

#pragma pop_macro("GetObject")

这解决了标题问题,但是您仍然必须在要使用该函数的代码周围添加此代码,以便对其进行编译,否则它将尝试编译GetObjectW,而该对象现在在编译时不存在。 / p>

答案 1 :(得分:0)

我有同样的问题。 我刚刚测试了此解决方案,它有效! 谢谢!

您必须将文件复制到桌面才能对其进行修改,然后在安装目录中重新复制它。

我补充说,有必要使用必须从存储桶中创建的EndPoint名称来初始化TAmazonConnectInfo组件的属性“ Storage EndPoint”