Показать сообщение отдельно
Старый 08.01.2003, 11:17   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Получить курс валют из интернета
Кто нибудь пробовал решить такую задачу ?

Вот накануне набросал на VC:

PHP код:
// 1 - Open
HINTERNET open InternetOpen("RSDN HTTP Reader"INTERNET_OPEN_TYPE_PRECONFIG,  NULLNULL0);

// 2 - Connect
HINTERNET connect InternetConnect(open"www.cbr.ru"INTERNET_DEFAULT_HTTP_PORTNULLNULL,  INTERNET_SERVICE_HTTP,0,1u);

// 3 - OpenRequest
LPCTSTR AcceptTypes[] = { TEXT("*/*"), NULL};
HINTERNET openRequest HttpOpenRequest(connect"GET"
   
"/currency_base/D_print.asp?date_req=05.01.2003"NULL""AcceptTypes,
   (
INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID0
    | 
INTERNET_FLAG_KEEP_CONNECTION1);

// 4 - SendRequest
LPCTSTR headers TEXT("Content-Type: application/x-www-form-urlencoded\r\n"
    "Accept-Language:ru\r\n" "Accept-Encoding:gzip, deflate"
);
BOOL sendRequest HttpSendRequest(openRequestheaders, -1, (LPVOID""0);

// 5 - ReadFile
char     DataBuffer[7000];
DWORD    size 6500;
DWORD       bytesRead ;
BOOL readFile InternetReadFile(openRequestDataBuffersize, &bytesRead);
                    
cout << DataBuffer << endl;
cout << bytesRead << endl
Все работает.

Решил попробовать реализовать это дело в Аксапте:

Есть класс WinInet; в нем есть методы InternetOpen и InternetReadFileб но нет InternetConnect, HttpOpenRequest и многих других мне необходимых.
Ладно думаю, не беда - создам наследника и в нем все это реализую. Не тут то было. WinInet объявлен как final. А почему ? А зачем ? Не понимаю.
Ладно. Создаю свой класс:

PHP код:
void new()
{
    try
    {
        
_winInet = new DLL("WinInet");
    } catch(
Exception::Internal)
    {
        
infolog.clear();
        return;
    }

    
_internetConnect = new DLLFunction(_winInet,"InternetConnect");
    
_internetConnect.returns(ExtTypes::DWORD);
    
_internetConnect.arg(ExtTypes::DWORD);         // HINTERNET
    
_internetConnect.arg(ExtTypes::STRING);        // ServerName
    
_internetConnect.arg(ExtTypes::DWORD);         // ServerPort = 80
    
_internetConnect.arg(ExtTypes::STRING);        // UserName
    
_internetConnect.arg(ExtTypes::STRING);        // Password
    
_internetConnect.arg(ExtTypes::DWORD);         // Service
    
_internetConnect.arg(ExtTypes::DWORD);         // Flags
    
_internetConnect.arg(ExtTypes::DWORD);         // Context

При попытке создать этот класс Axapta ругается:

DLL function not found InternetConnect.

Как не найдена. MSDN говорит, что она в той же dll-ке, что и InternetOpen. Более того, мой эксперимент с VC подтверждает это.

Получается, что одни функции в dll Аксапта видит другие нет ? Почему ?

Или такие задачи в Аксапте решаются гораздо проще ? Может есть классы, которые на более высоком уровне позволяют работать с интернет ?

P.S.

Несмотря на то, что WinInet объявлен как final, я создал его наследника, добавил в него свой метод и переопределил один из его методов. Это что, глюк Аксапты ? (Axapta 2.5 SP2)