У меня есть служба vb6, которая использует синхронные вызовы WinHttp на удаленный сервер. Эти вызовы блокируют службу в периоды, когда возникают проблемы с подключением (сеть/Интернет и т. д.).
Моя задача — реализовать асинхронные вызовы WinHttp.
Первый шаг, я пытаюсь выяснить преобразования из С++ в vb6. Принимая во внимание, что я никогда раньше не писал ни строчки на C++.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383917(v=vs.85).aspx
typedef void ( CALLBACK *WINHTTP_STATUS_CALLBACK)(
_In_ HINTERNET hInternet,
_In_ DWORD_PTR dwContext,
_In_ DWORD dwInternetStatus,
_In_ LPVOID lpvStatusInformation,
_In_ DWORD dwStatusInformationLength
);
Это моя попытка:
Public Declare Function WINHTTP_STATUS_CALLBACK Lib "winhttp.dll"
(ByVal hSession As Long, dwContext As Long, dwInternetStatus As Integer,
lpvStatusInformation As Long, dwStatusInformationLength As Integer)
Я понятия не имею, правильно ли это, и, к сожалению, я не могу проверить это, пока не продвинусь немного дальше.
Следующий — WinHttpSetStatusCallback.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384115(v=vs.85).aspx
WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(
_In_ HINTERNET hInternet,
_In_ WINHTTP_STATUS_CALLBACK lpfnInternetCallback,
_In_ DWORD dwNotificationFlags,
_Reserved_ DWORD_PTR dwReserved
);
Это моя попытка:
Public Declare Function WinHttpSetStatusCallback Lib "winhttp.dll"
(ByVal hInternet As Long, ByVal lpfnInternetCallback As Long,
ByVal dwNotificationFlags As Long, ByVal dwReserved As Long) As Long
Я действительно не знаю, правильны ли мои преобразования. Кто-нибудь может это проверить?
Далее, я не знаю, как реализовать WinHttpSetStatusCallback - например, я не знаю, правильно ли у меня указан указатель на функцию обратного вызова.
_In_ WINHTTP_STATUS_CALLBACK lpfnInternetCallback,
конвертировано в:
ByVal lpfnInternetCallback As Long
Я тоже не уверен, что у меня это правильно.
У меня нет четкого представления о том, как определить саму функцию асинхронного обратного вызова. Вот моя первоначальная попытка:
Public Function AsyncCallback(
ByVal hInternet As Long,
dwContext As Long,
dwInternetStatus As Long,
lpvStatusInformation As Long,
dwStatusInformationLength As Long)
//code in here
End Function
Затем, наконец, будет интересно все это подключить. Но сначала я должен убедиться, что у меня правильные основы, иначе я не могу ожидать, что это волшебным образом «сработает».
Пример MSDN C++ выглядит следующим образом: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384115(v=vs.85).aspx
// Install the status callback function.
WINHTTP_STATUS_CALLBACK isCallback = WinHttpSetStatusCallback( hSession,
(WINHTTP_STATUS_CALLBACK)AsyncCallback,
WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,
NULL);
Как определить указатель на функцию AsyncCallback в vb6?
WinHttp.WinHttpRequest
представляет собой довольно тонкую оболочку низкоуровневых вызовов WinHttp и предоставляет события вместо обратных вызовов. Есть ли причина, по которой вы просто не используете его вместо этого? - person Bob77   schedule 12.08.2013