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)'

Самое простое воспроизведение этой ошибки:

  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 в моей системе, и не похоже, что примеры были обновлены для 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, которого сейчас не существует во время компиляции.

Другие вопросы по тегам