1

我正在尝试移动使用 C++BuilderTAmazonConnectionInfo访问 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 *, Data::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 的代码示例,并且似乎没有在 SourceForge 上的RAD Studio 演示代码上为 Rio 更新示例。

我确实在https://github.com/Embarcadero/RADStudio10.3Demos/tree/master/CPP在 Github 上找到了示例,但 Cloud 示例似乎没有针对 C++ Builder 迁移,仅针对 Object Pascal。

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

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

那么,是否有一个可以在 10.3 Rio 下编译和链接的工作 C++Builder 示例?我怎样才能让这个项目编译和链接?

4

2 回答 2

0

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

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

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

于 2020-09-01T17:07:18.190 回答
0

问题是Data.Cloud.AmazonAPI.hpp标头在内部包含wingdi.hWindows 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。

于 2020-02-21T18:15:55.240 回答