C++ Builder 10.3. Пример службы хранилища Amazon Rio
Я пытаюсь переместить приложение, которое использует C++Builder TAmazonConnectionInfo
для доступа к объектам в Amazon Simple Storage Service (S3). У меня была версия, работающая в C++Builder 10.1 Berlin, но когда я пытаюсь переместить ее в 10.3 Rio, ссылка завершается с нерешенной внешней ошибкой:
[ilink32 Ошибка] Ошибка: Неразрешенные внешние данные __fastcall::Cloud::Amazonapi::TAmazonStorageService::GetObjectW(System::UnicodeString, System::UnicodeString, System::Classes::TStream *, Данные::Cloud::Cloudapi::TCloudResponseInfo *, Данные:: Облако::Amazonapi::TAmazonRegion)'
Самое простое воспроизведение этой ошибки:
- Создайте новое приложение C++ Builder 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 в моей системе, и не похоже, что примеры были обновлены для Rio в демонстрационном коде RAD Studio на SourceForge.
Я пытался добавить CloudService.lib
проекту, но это не помогло. Ни один не сделал добавление:
#pragma link "Data.Cloud.CloudAPI"
#pragma link "Data.Cloud.AmazonAPI"
Итак, есть ли работающий пример C++Builder, который компилирует и ссылается под 10.3 Rio? Как я могу получить этот проект для компиляции и ссылки?
0 ответов
У меня такая же проблема. Я только что протестировал это решение, оно работает! Спасибо!
Вы должны скопировать файл на рабочий стол, чтобы иметь возможность изменить его, а затем повторно скопировать его в каталог установки.
Я добавляю, что необходимо инициализировать свойство "Storage EndPoint" компонента TAmazonConnectInfo с именем EndPoint, которое вы должны создать из своего Bucket.
Проблема в том, что 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, которого сейчас не существует во время компиляции.