我正在尝试移动一个使用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)'
此错误的最简单再现是:
将点击处理程序替换为:
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示例?如何获得该项目的编译和链接?
答案 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”