我正在尝试将使用C 构建器的TAmazonConnectionInfo
的应用程序移动到Amazon Simple Storage Service(S3)上的对象。我有一个版本在C 建造者10.1柏林工作,但是当我尝试将其移至10.3 Rio时,该链接会因未解决的外部错误而失败:
[ILINK32错误]错误:未解决的外部'__fastCall data :: cloud :: Amazonapi :: TamazonStorageservice :: getObjectw(System :: Unicodestring,System,System :: Unicodestring:: Cloudapi :: tcloudresponseinfo *,data :: cloud :: amazonapi :: tamazonregion)'
此错误的最简单再现是:
- 创建一个新的C 构建器VCL应用程序
- 将tamazonConnectionInfo对象和一个按钮放在表单上,然后双击按钮
-
用:
替换点击处理程序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的代码样本,并且似乎没有在Rad Studio Demo Code上为Rio更新了Rio的样本在SourceForge上。
我确实在https://github.com/embarcadero/radstudio10.3demos/tree/tree/master/master/cpp上找到了github上的样品。
我尝试在项目中添加CloudService.lib
,但这无济于事。也没有添加:
#pragma link "Data.Cloud.CloudAPI"
#pragma link "Data.Cloud.AmazonAPI"
那么,是否有一个工作的C 构建器样本,该样本在10.3 Rio以下编译和链接?我该如何使该项目进行编译和链接?
问题是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>
我也有同样的问题。我刚刚测试了该解决方案,它起作用了!谢谢!
您必须将文件复制到桌面,以便能够对其进行修改,然后在安装目录中重新复制。
我补充说,有必要初始化属性"存储端点"。tamazonConnectInfo组件的名称,您必须从存储桶中创建端点的名称