The MASM Forum

General => The Campus => Topic started by: sasaers on March 20, 2015, 10:05:24 AM

Title: Troubles with WinHTTP
Post by: sasaers on March 20, 2015, 10:05:24 AM
Hi guys. While reading about WinHTTP I found one problem I can't solve. It's about IWinHttpRequest::SetProxy method. How to use methods in MASM? I tried to find it in export table of winhttp.dll  but it doesn't exist.



Thanks!
Title: Re: Troubles with WinHTTP
Post by: dedndave on March 20, 2015, 10:52:34 AM
it's a COM interface - the masm32 package doesn't have all the necessary includes
we generally make our own for COM
Title: Re: Troubles with WinHTTP
Post by: dedndave on March 20, 2015, 01:27:58 PM
as COM interfaces go, this one's not too bad

this is from the platform sdk, httprequest.idl file

#include "httprequestid.h"




[
    uuid(662901fc-6951-4854-9eb2-d9a2570f2b2e),
    helpstring("Microsoft WinHTTP Services, version 5.1"),
    lcid(0x0000),
    version(5.1)

]
library WinHttp
{
    importlib ("stdole2.tlb");

    typedef [public] long   HTTPREQUEST_PROXY_SETTING;
    const HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_DEFAULT    = 0x00000000;
    const HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_PRECONFIG  = 0x00000000;
    const HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_DIRECT     = 0x00000001;
    const HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_PROXY      = 0x00000002;

    typedef [public] long   HTTPREQUEST_SETCREDENTIALS_FLAGS;
    const HTTPREQUEST_SETCREDENTIALS_FLAGS  HTTPREQUEST_SETCREDENTIALS_FOR_SERVER   = 0x00000000;
    const HTTPREQUEST_SETCREDENTIALS_FLAGS  HTTPREQUEST_SETCREDENTIALS_FOR_PROXY    = 0x00000001;

    typedef
    [uuid(12782009-FE90-4877-9730-E5E183669B19), helpstring("WinHttpRequest Options")]
    enum WinHttpRequestOption
    {
        WinHttpRequestOption_UserAgentString,
        WinHttpRequestOption_URL,
        WinHttpRequestOption_URLCodePage,
        WinHttpRequestOption_EscapePercentInURL,
        WinHttpRequestOption_SslErrorIgnoreFlags,
        WinHttpRequestOption_SelectCertificate,
        WinHttpRequestOption_EnableRedirects,
        WinHttpRequestOption_UrlEscapeDisable,
        WinHttpRequestOption_UrlEscapeDisableQuery,
        WinHttpRequestOption_SecureProtocols,
        WinHttpRequestOption_EnableTracing,
        WinHttpRequestOption_RevertImpersonationOverSsl,
        WinHttpRequestOption_EnableHttpsToHttpRedirects,
        WinHttpRequestOption_EnablePassportAuthentication,
        WinHttpRequestOption_MaxAutomaticRedirects,
        WinHttpRequestOption_MaxResponseHeaderSize,
        WinHttpRequestOption_MaxResponseDrainSize,
        WinHttpRequestOption_EnableHttp1_1,
        WinHttpRequestOption_EnableCertificateRevocationCheck
    } WinHttpRequestOption;

    typedef
    [uuid(9d8a6df8-13de-4b1f-a330-67c719d62514)]
    enum WinHttpRequestAutoLogonPolicy
    {
        AutoLogonPolicy_Always,
        AutoLogonPolicy_OnlyIfBypassProxy,
        AutoLogonPolicy_Never
    } WinHttpRequestAutoLogonPolicy;

    typedef
    [uuid(152a1ca2-55a9-43a3-b187-0605bb886349)]
    enum WinHttpRequestSslErrorFlags
    {
        SslErrorFlag_UnknownCA       = 0x00000100,
        SslErrorFlag_CertWrongUsage  = 0x00000200,
        SslErrorFlag_CertCNInvalid   = 0x00001000,
        SslErrorFlag_CertDateInvalid = 0x00002000,
        SslErrorFlag_Ignore_All      = 0x00003300
    } WinHttpRequestSslErrorFlags;


    typedef
    [uuid(6b2c51c1-a8ea-46bd-b928-c9b76f9f14dd)]
    enum WinHttpRequestSecureProtocols
    {
        SecureProtocol_SSL2 = 0x00000008,
        SecureProtocol_SSL3 = 0x00000020,
        SecureProtocol_TLS1 = 0x00000080,
        SecureProtocol_ALL  = 0x000000A8
    } WinHttpRequestSecureProtocols;


    [
        object,
        uuid(016fe2ec-b2c8-45f8-b23b-39e53a75396b),
        odl,
        dual,
        oleautomation,
        nonextensible,
        helpstring("IWinHttpRequest Interface"),
        pointer_default(unique)
    ]
    interface IWinHttpRequest : IDispatch
    {
        [id(DISPID_HTTPREQUEST_SETPROXY), helpstring("Specify proxy configuration")]
        HRESULT SetProxy([in] HTTPREQUEST_PROXY_SETTING ProxySetting,
                         [in, optional] VARIANT ProxyServer,
                         [in, optional] VARIANT BypassList);

        [id(DISPID_HTTPREQUEST_SETCREDENTIALS), helpstring("Specify authentication credentials")]
        HRESULT SetCredentials([in] BSTR UserName,
                         [in] BSTR Password,
[in] HTTPREQUEST_SETCREDENTIALS_FLAGS Flags);

        [id(DISPID_HTTPREQUEST_OPEN), helpstring("Open HTTP connection")]
        HRESULT Open([in] BSTR Method, [in] BSTR Url, [in, optional] VARIANT Async);

        [id(DISPID_HTTPREQUEST_SETREQUESTHEADER), helpstring("Add HTTP request header")]
        HRESULT SetRequestHeader([in] BSTR Header, [in] BSTR Value);

        [id(DISPID_HTTPREQUEST_GETRESPONSEHEADER), helpstring("Get HTTP response header")]
        HRESULT GetResponseHeader([in] BSTR Header, [out, retval] BSTR * Value);

        [id(DISPID_HTTPREQUEST_GETALLRESPONSEHEADERS), helpstring("Get all HTTP response headers")]
        HRESULT GetAllResponseHeaders([out, retval] BSTR * Headers);

        [id(DISPID_HTTPREQUEST_SEND), helpstring("Send HTTP request")]
        HRESULT Send([in, optional] VARIANT Body);

        [propget, id(DISPID_HTTPREQUEST_STATUS),  helpstring("Get HTTP status code")]
        HRESULT Status([out, retval] long * Status);

        [propget, id(DISPID_HTTPREQUEST_STATUSTEXT),  helpstring("Get HTTP status text")]
        HRESULT StatusText([out, retval] BSTR * Status);

        [propget, id(DISPID_HTTPREQUEST_RESPONSETEXT),  helpstring("Get response body as a string")]
        HRESULT ResponseText([out, retval] BSTR * Body);

        [propget, id(DISPID_HTTPREQUEST_RESPONSEBODY), helpstring("Get response body as a safearray of UI1")]
        HRESULT ResponseBody([out, retval] VARIANT * Body);

        [propget, id(DISPID_HTTPREQUEST_RESPONSESTREAM), helpstring("Get response body as a stream")]
        HRESULT ResponseStream([out, retval] VARIANT * Body);

        [propget, id(DISPID_HTTPREQUEST_OPTION)]
        HRESULT Option([in] WinHttpRequestOption Option, [out, retval] VARIANT * Value);

        [propput, id(DISPID_HTTPREQUEST_OPTION)]
        HRESULT Option([in] WinHttpRequestOption Option, [in] VARIANT Value);

        [id(DISPID_HTTPREQUEST_WAITFORRESPONSE), helpstring("Wait for asynchronous send to complete, with optional timeout (in seconds)")]
        HRESULT WaitForResponse([in, optional] VARIANT Timeout, [out, retval] VARIANT_BOOL * Succeeded);

        [id(DISPID_HTTPREQUEST_ABORT), helpstring("Abort an asynchronous operation in progress")]
        HRESULT Abort();

        [id(DISPID_HTTPREQUEST_SETTIMEOUTS), helpstring("Specify timeout settings (in milliseconds)")]
        HRESULT SetTimeouts([in] long ResolveTimeout, [in] long ConnectTimeout, [in] long SendTimeout, [in] long ReceiveTimeout);

        [id(DISPID_HTTPREQUEST_SETCLIENTCERTIFICATE), helpstring("Specify a client certificate")]
        HRESULT SetClientCertificate([in] BSTR ClientCertificate);

        [id(DISPID_HTTPREQUEST_SETAUTOLOGONPOLICY), helpstring("Specify if credentials should be sent automatically")]
        HRESULT SetAutoLogonPolicy([in] WinHttpRequestAutoLogonPolicy AutoLogonPolicy);
    };

    [
        object,
        uuid(f97f4e15-b787-4212-80d1-d380cbbf982e),
        odl,
        oleautomation,
        nonextensible,
        helpstring("IWinHttpRequestEvents Interface"),
        pointer_default(unique)
    ]
    interface IWinHttpRequestEvents : IUnknown
    {
        void OnResponseStart([in] long Status, [in] BSTR ContentType);

        void OnResponseDataAvailable([in] SAFEARRAY(unsigned char) * Data);

        void OnResponseFinished();

        void OnError([in] long ErrorNumber, [in] BSTR ErrorDescription);
    };


    // WinHttpRequest Class
    [
        uuid(2087c2f4-2cef-4953-a8ab-66779b670495),
        helpstring("WinHttpRequest component")
    ]
    coclass WinHttpRequest
    {   
        [default] interface IWinHttpRequest;
        [default, source] interface IWinHttpRequestEvents;
    };
}