自分でホームページなどを用意し、その中にファイルをアップロードしておきます。
 
クラス C*1 (名前は各自決めてください)は、どの派生クラスでも使用する関数を集めます。
その中で、必要なものだけ。
 

宣言部分(コンストラクタなど一部略)

#include "wininet.h"

class C****1
{
protected:
    //   文字列 (メモリ管理)
    static WCHAR* MemoryWCharStr(int nLength) ;
    static WCHAR* MemoryWideCharFromMultiChar(

        const char* lpszMultiByteStr ,

        UINT uCodePage = CP_ACP

    ) ;
    //   基本関数 (共通処理)
    static HINTERNET InternetOpen(

        DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG

    ) ;
};

関数の中身は以下の感じ。

#pragma comment(lib,"wininet.lib")
/////////////////////////////////////////////////////////////////////
//   基本関数 (共通処理)
/////////////////////////////////////////////////////////////////////

// 1. (静的関数) (protected) インターネット使用開始 (Win32初期化) //
HINTERNET C*1::InternetOpen(DWORD dwAccessType)
{

    /*************************************************
    HINTERNET InternetOpen(
        IN LPCSTR lpszAgent,
        IN DWORD dwAccessType,
        IN LPCSTR lpszProxyName,
        IN LPCSTR lpszProxyBypass,
        IN DWORD dwFlags
    );
    Initializes an application's use of the Win32 Internet functions.
    *************************************************/

    return ::InternetOpen(
                _T("class name") ,
                dwAccessType , // INTERNET_OPEN_TYPE_PRECONFIG
                NULL ,
                NULL ,
                0
            ) ;
}

 

/////////////////////////////////////////////////////////////////////
//   文字列 (メモリ管理)
/////////////////////////////////////////////////////////////////////
// 1-(1). (静的関数) (protected) WCHAR [] のメモリ確保 //

WCHAR* C*1::MemoryWCharStr(int nLength)
{
    // 1. メモリ確保 //
    WCHAR* pText = new WCHAR [nLength] ;

 

    // 2. 初期化 //
    ::memset(pText , 0 , sizeof(WCHAR) * nLength) ;

 

    return pText ;
}

// 1-(2). (静的関数) マルチバイト文字列 (char*) を

//           ワイド文字列 (UNICODE) に変換してメモリ確保 //
// ※ UINT uCodePage = CP_ACP ; // または CP_THREAD_ACP

WCHAR* C*1::MemoryWideCharFromMultiChar(

        const char* lpszMultiByteStr ,

        UINT uCodePage)
{
    /**************************************************
    MultiByteToWideChar() : マルチバイト文字列をワイド文字列に変換
    ------------------------------------------------------------------------
    int MultiByteToWideChar(
        UINT CodePage,         // コードページ
        DWORD dwFlags,         // 文字の種類を指定するフラグ
        LPCSTR lpMultiByteStr, // マップ元文字列のアドレス
        int cchMultiByte,      // マップ元文字列のバイト数
        LPWSTR lpWideCharStr,  // マップ先ワイド文字列を入れる

                                            //バッファのアドレス
        int cchWideChar        // バッファのサイズ
    );
    **************************************************/

    // (UINT)uCodePage = CP_ACP または CP_THREAD_ACP
    DWORD dwFlags = MB_PRECOMPOSED ;

    // 1. 必要なサイズを計算して取得 //
    int retSize = ::MultiByteToWideChar(
        uCodePage        ,
        dwFlags          ,
        lpszMultiByteStr ,
        -1        ,
        NULL    , // lpMultiByteStr が指すバッファは使われません
        0            // 0 を指定するとバッファに必要なバイト数が返ります
    );

    // 2. メモリ確保 //
    WCHAR* pWCharMemory = MemoryWCharStr(retSize + 1) ;

    // 3. 変換 //
    int ret = ::MultiByteToWideChar(
        uCodePage        ,
        dwFlags          ,
        lpszMultiByteStr ,
        -1               ,
        pWCharMemory     ,
        retSize
    );

    return pWCharMemory;
}

 
従来のC言語でなかなか痛いところが、文字コードの違い。
バイト文字 char 型と、ワイド文字とか、Unicodeとか、変換が必要だったりするので、きめ細かく対応しないと正しく動作しない。
 
 
インターネット上のファイルへのアクセスの基本的な流れは以下の通り。

// (1). インターネット開始 //

//      (ハンドルを取得)

HINTERNET hInternet = C*1::InternetOpen() ;
if (hInternet == NULL) return 0 ;

 
// (2). 読み取りなどの処理 //
    ....

 

// (3). 終了処理 //
::InternetCloseHandle(hInternet) ;
 
 
ワイド文字に変換した場合、必ずメモリ解放を行う必要がある。

// (1). 変換 (メモリ確保) //

WCHAR* pszWBuffer = C*1::MemoryWideCharFromMultiChar(

        "..."         , // const char* lpszMultiByteStr

         CP_ACP    // UINT uCodePage

) ;

 

// (2). 処理 //
    ....

 

// (3). メモリ解放 //

delete [] pszWBuffer ;

 
 
最終的に、こんな自動アップデートを目指します。
(Google Chrome や Firefox などのように)
 
 
 
 
**************************************************************