2017-05-09 265 views
0

我在C++ Builder XE4 VCL 32bit中使用下面的代码。我正在使用Indy组件,版本10.6.0.497。在C++ Builder中使用Indy IdHTTP的HTTPS Web地址

我一直在使用IdHTTP->Get(),并将HTTP地址改为HTTPS。我相信我需要创建一个TIdSSLIOHandlerSocketOpenSSL组件并将其作为IOHandler添加到TIdHTTP

当我尝试这样做,下面的代码给出了错误:

E2451 Undefined symbol 'TIdSSLIOHandlerSocketOpenSSL'

的错误是在代码,std::auto_ptr<TIdSSLIOHandlerSocketOpenSSL>

我不确定为什么TIdSSLIOHandlerSocketOpenSSL未定义,因为我安装了Indy,并且可以使用TIdSSLIOHandlerSocketOpenSSL作为组件面板中的传统组件。

任何人都可以告诉我如何设置此代码使用HTTPS地址?

std::auto_ptr<TIdSSLIOHandlerSocketOpenSSL> Local_IOHandler(new TIdSSLIOHandlerSocketOpenSSL(NULL)); 
//error: E2451 Undefined symbol 'TIdSSLIOHandlerSocketOpenSSL' 
//error: E2299 Cannot generate template specialization from 'std::auto_ptr<_Ty>' 


std::auto_ptr<TIdHTTP> Local_IdHTTP(new TIdHTTP(NULL)); 
Local_IdHTTP->Name="MyLocalHTTP"; 
Local_IdHTTP->HandleRedirects=true; 
Local_IdHTTP->IOHandler=Local_IOHandler; 

TStringStream *jsonToSend = new TStringStream; 

UnicodeString GetURL = "https://chartapi.finance.yahoo.com/instrument/1.0/CLZ17.NYM/chartdata;type=quote;range=1d/csv/"; 

jsonToSend->Clear(); 
try 
{ 
    Local_IdHTTP->Get(GetURL, jsonToSend); 
} 
catch (const Exception &E) 
{ 
    ShowMessage(E.Message); 
    //error: IOHandler value is not valid 
} 
+0

而BTW,10.6.0.497是Indy的旧版本。目前的版本是10.6.2.5422。在10.6.0和10.6.2之间进行了很多修改和修改。 –

回答

1

When I try to do this the code below gives the error E2451 Undefined symbol 'TIdSSLIOHandlerSocketOpenSSL'

添加#include <IdSSLOpenSSL.hpp>到您的代码。

I am not sure why 'TIdSSLIOHandlerSocketOpenSSL' is Undefined because I have Indy installed and can use 'TIdSSLIOHandlerSocketOpenSSL' as a traditional component from the compoenent pallet?

在设计时删除一个组件到您的表单自动为您生成任何必要的#include语句。 TIdSSLIOHandlerSocketOpenSSL也不例外。

这就是说,一旦你得到那个固定的,你不能指定一个std::auto_ptr本身IOHandler。您需要使用它的get()方法来获取对象指针:

Local_IdHTTP->IOHandler = Local_IOHandler.get(); 

而且你应该考虑使用std::auto_ptr为您TStringStream还有:在这种情况下

std::auto_ptr<TStringStream> json(new TStringStream); 
Local_IdHTTP->Get(GetURL, json.get()); 
// use json as needed... 

虽然,我会建议使用重载版本TIdHTTP::Get()返回String,而不是使用TStringStream

String json = Local_IdHTTP->Get(GetURL); 
// use json as needed... 
相关问题