我有一个使用同步 WinHttp 调用远程服务器的 vb6 服务。当出现连接问题(网络/互联网等)时,这些调用会锁定服务。
我的任务是实现 WinHttp 异步调用。
第一步,我试图弄清楚从 C++ 到 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);
如何在 vb6 中定义指向 AsyncCallback 函数的指针?