1

I have the following code snippet:

        // 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));
            }
        }

while st is a global object with a member dwSize.

When I'm running this part in debugging mode I see that st.dwSize does not change its value after the call to WinHttpQueryHeaders.

But if I create a local var DWORD dwSize = 0 and send &dwSize to WinHttpQueryHeaders, it does obtain buffer size and succeeds to change its value.

is there any reason why I shouldn't send a pointer of a global object's member to WinHttpQueryHeaders or to any other external API functions?

Guy Sadoun
  • 427
  • 6
  • 17
  • You should avoid global objects in general, because they are problematic from the software design perspective, but there's nothing wrong with them on the Winapi or C++ level. There must be some other factor in play there, but we can only guess what it could be. Please post a [mcve]. – n. m. could be an AI Oct 31 '21 at 12:06

1 Answers1

0

the reason WinHttpQueryHeaders did not succeed to change st.dwSize it's because I declered st as a static global var.

static WinHttpSubtransport st;

and as written in Scope rules of the "persistent" variables in C:

A static global variable is a global variable that can only be accessed by functions in the same C program file as the variable.

Guy Sadoun
  • 427
  • 6
  • 17