[英]C++ Builder 10.3 Rio Amazon Storage Service Example
我正在尝试移动使用 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 *, Data::Cloud::Amazonapi::TAmazonRegion)'
此错误的最简单再现是:
将点击处理程序替换为:
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 示例? 我怎样才能让这个项目编译和链接?
问题在于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.
之前#pragma delphiheader end.
(在第 897 行附近)添加以下内容:
#pragma pop_macro("GetObject")
这解决了标头问题,但您仍然必须在要使用该函数的代码周围添加它,以便进行编译,否则它将尝试编译现在在编译时不存在的 GetObjectW。
我有同样的问题。 我刚刚测试了这个解决方案,它有效! 谢谢!
您必须将该文件复制到桌面才能对其进行修改,然后将其重新复制到安装目录中。
我补充说,有必要使用您必须从 Bucket 创建的 EndPoint 的名称来初始化 TAmazonConnectInfo 组件的属性“Storage EndPoint”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.