首页 > 解决方案 > 将全局变量成员的指针发送到 WinHttpQueryHeaders (WinHTTP API) 不会改变它的值

问题描述

我有以下代码片段:

        // Using HttpQueryInfo to obtain the size of the buffer into dwSize.
        if (!WinHttpQueryHeaders(hRequest,
            WINHTTP_QUERY_RAW_HEADERS_CRLF,
            WINHTTP_HEADER_NAME_BY_INDEX, NULL, &st.dwSize, WINHTTP_NO_HEADER_INDEX))
        {
            // An ERROR_INSUFFICIENT_BUFFER is expected because you
            // are looking for the size of the headers.  If any other
            // error is encountered, display error information.
            DWORD dwErr = GetLastError();
            if (dwErr != ERROR_INSUFFICIENT_BUFFER)
            {
                DEBUG_PRINT(("Error %d encountered.", dwErr));
                return;
            } else {
                // enters here and prints '0' (initial value)
                DEBUG_PRINT(("size of buffer: ", &st.dwSize));
            }
        }

whilest是一个带有成员的全局对象dwSize

当我在调试模式下运行这部分时,我看到st.dwSize在调用WinHttpQueryHeaders.

但是,如果我创建一个本地 varDWORD dwSize = 0并发&dwSize送到WinHttpQueryHeaders,它会获得缓冲区大小并成功更改其值。

有什么理由不应该将全局对象成员的指针发送到WinHttpQueryHeaders或发送到任何其他外部 API 函数?

标签: c++11winhttp

解决方案


WinHttpQueryHeaders没有成功改变它的原因st.dwSize是因为我st作为一个static全局变量。

static WinHttpSubtransport st;

并如C 中“持久”变量的范围规则中所写:

静态全局变量是一个全局变量,它只能被与该变量位于同一 C 程序文件中的函数访问。


推荐阅读