Кто нибудь пробовал решить такую задачу ?
Вот накануне набросал на VC:
PHP код:
// 1 - Open
HINTERNET open = InternetOpen("RSDN HTTP Reader", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
// 2 - Connect
HINTERNET connect = InternetConnect(open, "www.cbr.ru", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, 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,
(0 ? INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID: 0)
| INTERNET_FLAG_KEEP_CONNECTION, 1);
// 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(openRequest, headers, -1, (LPVOID) "", 0);
// 5 - ReadFile
char DataBuffer[7000];
DWORD size = 6500;
DWORD bytesRead ;
BOOL readFile = InternetReadFile(openRequest, DataBuffer, size, &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)