2年前に買ったパソコンが、Windows11インストール不可。

 そんな診断を受け、調べたら、TPM2.0なんていう聞いたこともない言葉が出てきた。

 BIOS設定で変えなければならないなんて、素人ではできないだろうに。これはかなりきつい。わからない人に、新しいパソコンを買わせる戦術だろうか。

 

 

 パソコン起動と同時に、F2か、F12か、DELか、ESCか、何かを押すとBIOS設定が画面が表示される。

 下手に変更するとWindowsが起動しなくなるから、わからないところは絶対に変えない。

 

 

 AdvancedModeとか選んで、色々と探していると、以下の画面に出会った。

 

 きっとパソコンによって違うから、頑張って探すしかない。

 要は、TPMとか、PPTとか、そんな選択が可能なページを探すのだ。

 

 

 

 自分の場合、以下の選択が可能だった。

 何だかわからなかったけど、Googleで調べると、

 

dTPM = disable (不可)

PTT = TPM2.0

 

らしい。

 

 ということで、PTTを選択

 

 

 

 何やら注意書が出てくるので不安だったが、OK。

 

 

 

 

 BIOS設定は、F10あたりで「保存&再起動」なので、それを選ぶ。

 やめる場合は、ESCキーを押す。

 

 

 

 これで、Windows11のインストール診断が「OK」になった。

 

 

 BIOS設定をいじるなんて、多くの人に辛い設定だ。

 

前回の記事(2)はこちら↓

lhttps://ameblo.jp/devprogc15/entry-12674442626.html

 
 今回は、インターネット上のファイルをダウンロードしてパソコン内に保存する方法を書く。
 
 面倒なので、class C*1 を基本クラスとした関数を書くことにする。
 
 手順としては、
・インターネット上のファイルを開く
・パソコン内にファイルを作成
・インターネット上のファイルのバイト列を読み取り、
 パソコン内のファイルに書き込み
 (これを終わりまで繰り返す)
という感じ。
 
 おそらく、マルチスレッドで処理するはず(途中でキャンセルボタンを押す場合を想定)。
 なので、中止する場合や途中経過について、親ウィンドウへメッセージ送信することを少し考慮しておく。

 

宣言部分・・・略

関数部分(骨格は以下の感じ)

/////////////////////////////////////////////////////////////////////
//   ダウンロード
/////////////////////////////////////////////////////////////////////
// 1-(1). (静的関数) ダウンロード実行 //
// ※ BOOL* pAborted            : 中止する場合

BOOL DownloadFile(
        CWnd* pWndParent ,
        LPCTSTR lpszURL ,

        HANDLE hFile ,
        BOOL* pAborted  )

{
    // 1. インターネット開始 //
    HINTERNET hInternet = C*1::InternetOpen() ;
    if (hInternet == NULL) return 0 ;

    // 2. 接続してダウンロード処理 //
    BOOL bResult = ExecuteDownloadFile(

                              pWndParent ,

                              hInternet ,

                              lpszURL ,

                              hFile ,

                              pAborted

                           ) ;

    // 3. 終了処理 //
    ::InternetCloseHandle(hInternet) ;

    return bResult ;
}

// 1-(2). (静的関数) ダウンロード実行 //
BOOL ExecuteDownloadFile(
                CWnd* pWndParent ,
                HINTERNET hInternet ,
                LPCTSTR lpszURL ,

                HANDLE hFile ,
                BOOL* pAborted  )
{
    TCHAR pszHeader[] = _T("Accept: */*\r\n\r\n") ;

    // 1. インターネット URL へのアクセス //
    /***************************************************
    HINTERNET InternetOpenUrl(
        IN HINTERNET hInternetSession,
        IN LPCSTR lpszUrl,
        IN LPCSTR lpszHeaders,
        IN DWORD dwHeadersLength,
        IN DWORD dwFlags,
        IN DWORD dwContext
    );
    Begins reading a complete FTP, Gopher, or HTTP URL.

    Use InternetCanonicalizeUrl first if the URL being used contains

    a relative URL and a base URL separated by blank spaces.

    -----------------------------------------------------------------------
    INTERNET_FLAG_RELOAD
      Forces a download of the requested file, object, or directory

      listing from the origin server, not from the cache.
    ***************************************************/
    // (1). 接続 //

    HINTERNET hConnect = ::InternetOpenUrl(
                            hInternet ,
                            lpszURL ,
                            NULL ,
                            0 ,
                            INTERNET_FLAG_RELOAD ,
                            0
                            // pszHeader ,
                            // -1 , // 自動で長さ判定 //
                            // INTERNET_FLAG_DONT_CACHE ,
                            // 0

                        );

    // (2). 失敗した場合 //
    if (hConnect == NULL) return FALSE ;

    // 2. ダウンロード実行 //
    BOOL bResult = ReadBufferFromFile(

                               pWndParent ,

                               hConnect ,

                               hFile ,

                               pAborted

                            ) ;

    // 3. 終了処理 //
    ::InternetCloseHandle(hConnect) ;

    return bResult ;
}

 

#define DEFAULT_BUFFER_SIZE    1024

 

// 2-(1). (静的関数) (private) ダウンロード実行 //
BOOL ReadBufferFromFile(

               CWnd* pWndParent ,

               HINTERNET hConnect ,

               HANDLE hFile ,

               BOOL* pAborted  )
{
    DWORD dwWrite ;
    DWORD dwRead ;
    BYTE szBuffer[DEFAULT_BUFFER_SIZE] ;

    // 1. 初期設定 //
    DWORD dwTotalSize = 0 ;
    BOOL bResult = TRUE ;

    // 2. URLから読み込んでファイル保存 //
    while(bResult)
    {
        // (1). データ読み取り //
        bResult = ::InternetReadFile(
                        hConnect  ,
                        szBuffer    ,
                        DEFAULT_BUFFER_SIZE , // 読み込むバイト数 //
                        &dwRead // 実際に読み込まれたバイト数 (結果) //
                    ) ;

        // (2). 成功終了 //
        /*************************************************
        If the return value is TRUE and the number of bytes read

        is zero, the transfer has been completed and there are no

        more bytes to read on the handle.
        *************************************************/

        if (bResult && dwRead == 0) break ;

        // (3). ファイルに書き込み //
        if (bResult && dwRead > 0 && hFile != NULL)
        {
            bResult = ::WriteFile(
                            hFile     ,
                            szBuffer ,
                            dwRead    ,
                            &dwWrite  ,
                            NULL
                        );
        }

        // (4). 合計サイズを更新 //
        dwTotalSize += dwRead ;

        // (5). 中断された場合 //
        if ( pAborted && *pAborted == TRUE )
        {
            bResult = FALSE ;
            break ;
        }

        // (6). 継続 //

        else if (pWndParent)
        {
            // 親ウィンドウへ送信 //
            // pWndParent->PostMessage(message , w , l) ;

        }
    } // end //

    return bResult ;
}

 

 インターネット上のファイルのバイト列を szBuffer[1024] に読み取り、そのままパソコン内のファイルに書き込む。

 

 別スレッドでキャンセルボタンが押されたら、pAborted の本体を TRUE にすれば、ダウンロード処理は勝手にループを抜けて終了してくれる。

 

 

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