RegCreateKey

RegCreateKeyは、指定のレジストリキー(regedit.exeで見るとフォルダの部分)を作成する・・・。

RegCreateKey 関数
RegCreateKey function (Windows)

互換性のために残されているだけなので、RegCreateKeyExを推奨するが、とりあえずキーを作成してみる・・・。
(※.レジストリをいじると、場合によってはWindowsが正しく動作しない可能性があるため、操作は慎重にすること・・・。バックアップを取っておくことを推奨する・・・。)

f:id:BG1:20170315110902p:plain

コンソールの空のプロジェクトで、

HKEY_CURRENT_USER\Softwareの下に"RegCreateKey"というキーを作成する・・・。
lRetがERROR_SUCCESSなら成功(これはエラーじゃない・・・。)、"SUCCESS!"と出力・・・。
hKeyにハンドルが格納される・・・。
このキーやこの下のサブキーでさらなる操作をする場合はhKeyを使うので保持しておく・・・。
最後にRegCloseKeyでhKeyを閉じる・・・。

実行前にregedit.exeで見ると、

f:id:BG1:20170315111616p:plain

Softwareの下はこうなっている・・・。
実行すると、

SUCCESS!
続行するには何かキーを押してください . . .

と出たので成功した模様・・・。

f:id:BG1:20170315111727p:plain

Softwareの下にRegCreateKeyが追加されている・・・。

Sample/winapi/RegCreateKey/RegCreateKey/src/RegCreateKey at master · bg1bgst333/Sample · GitHub

WlanEnumInterfaces

WiFi関連の操作をしたい場合は、Native WiFi APIを使う・・・。

Native Wifi (Windows)
Wireless LAN API - 目次 - 汁ごはん

中でも、WlanEnumInterfacesは、無線LANインターフェース情報の一覧を列挙する・・・。
(Windows XP3からなので、場合によってはWindowsSDKのインストールが必要・・・。)

WlanEnumInterfaces function (Windows)

プロパティで、

f:id:BG1:20170314120227p:plain

wlanapi.libをリンク・・・。

WlanOpenHandleでハンドルを開いて、hClientに持たせたら、それを使って他のAPIを呼び出す形式・・・。
WlanEnumInterfacesでWLAN_INTERFACE_INFO_LISTのポインタpwiiListが取れる・・・。
pwiiList->dwNumberOfItemsの数だけ、pwiiList->InterfaceInfo[ul].strInterfaceDescriptionを表示する・・・。
pwiiListは、WlanFreeMemoryで解放する必要があるので注意・・・。
最後はWlanCloseHandleでhClientを閉じる・・・。

Win7VMは無線インターフェイスが無いので、

Error!: dwRet = 1062
続行するには何かキーを押してください . . .

こうなってしまう・・・。
なので、インターフェイスのあるWin10のSurfacePro4だと、

pwiiList->InterfaceInfo[0].strInterfaceDescription = Marvell AVASTAR Wireless-AC Network Controller

1個だけだけど、出る・・・。

Sample/winapi/WlanEnumInterfaces/WlanEnumInterfaces/src/WlanEnumInterfaces at master · bg1bgst333/Sample · GitHub

GetInterfaceInfo

ネットワークインターフェース情報を取得するには、IPヘルパーAPI(iphlpapi.lib)を使う・・・。
GetInterfaceInfoは、ネットワークインターフェースを取得する・・・。

GetInterfaceInfo function (Windows)

といっても、これはインタフェースの名前とインデックスしか取れない・・・。
(しかも、ipconfigやデバイスマネージャなどで表示されるような名前ではない・・・。てか、どこでみれるんだ・・・。)

f:id:BG1:20170313171131p:plain

コンソールの、

f:id:BG1:20170313171143p:plain

空で、

f:id:BG1:20170313171153p:plain

iphlpapi.libをリンク・・・。

まず、第1引数をNULLにして、GetInterfaceInfoを呼ぶことで、インターフェース情報のサイズをdwOutBufLenに格納させる・・・。

そのあと、newでIP_INTERFACE_INFO構造体の分のメモリを確保し、もう一度GetInterfaceInfoを呼んで取得・・・。

一覧をfor文で出力したら、deleteでメモリを解放・・・。

pIpInterfaceInfo->Adapter[0].Index = 11, pIpInterfaceInfo->Adapter[0].Name = \DE
VICE\TCPIP_{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
続行するには何かキーを押してください . . .

Win7VMで実行したら、数字は伏せたけど、1個だけ出てきた・・・。
しかし、デバイスマネージャみてもipconfigみてもこの名前はないのでよくわからん・・・。

Sample/winapi/GetInterfaceInfo/GetInterfaceInfo/src/GetInterfaceInfo at master · bg1bgst333/Sample · GitHub

CreateRectRgn

これまで、図形を描画するのにRectangleのような描画APIを使ってきた・・・。
他にも楕円を描くEllipseや、多角形を描くPolygonとかがあるが、この図形そのものをハンドルを持つ1つのオブジェクトとして表示する方法もある・・・。
画面上に置けるこの図形のような領域をリージョンという・・・。

CreateRectRgnは、矩形型のリージョンを生成する・・・。

CreateRectRgn 関数

ウィンドウ上に矩形リージョンを表示する・・・。
WM_PAINTで、

CreateRectRgnで、位置(50, 50)でサイズが(300, 200)のリージョンを作成・・・。
このままだと背景が同じ色で見えないので、SelectObjectでhDCが選択しているブラシの色をグレーに変更・・・。
PaintRgnでそのデバイスコンテキストハンドルに設定されたグレーで着色・・・。
SelectObjectで元に戻す・・・。
DeleteObjectでhRgnも削除・・・。

f:id:BG1:20170313152045p:plain

こんな感じでグレーのリージョンが表示された・・・。

Sample/winapi/CreateRectRgn/CreateRectRgn/src/CreateRectRgn at master · bg1bgst333/Sample · GitHub

ユニヴァーサル参照

std::moveの仕様を見ると、

move (utility) - cpprefjp C++日本語リファレンス

"T&& t"という引数の型を見ると、右辺値参照っぽいのになぜ左辺値も引数に取れるのか不思議に思う・・・。
実は、テンプレート関数など、T&&での推論が発生する状況においては、右辺値なら右辺値参照、左辺値なら左辺値参照、という動作をするようになっている・・・。
これをユニヴァーサル参照という・・・。

発生する条件はちょっと複雑で詳しくは、

Universal Reference is 何 - 冬でもスイカバーが食べたい
右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス

を参照のこと・・・。

とりあえず、右辺値も左辺値も取れるのか試してみる・・・。

funcの定義でT&&で引数を取るようにして、funcに右辺値10と左辺値x(1を代入済み)を渡して呼ぶ・・・。

$ g++ universal_reference.cpp -o universal_reference -std=c++11
$ ./universal_reference
x = 1
val = 10 in func()
val = 100 in func()
val = 1 in func()
val = 100 in func()
x = 100
$

右辺値でも左辺値でもfuncの中で代入できる・・・。
ただ、右辺値の場合は本来一時オブジェクトのものに入れてるので保証しない・・・。

Sample/cpp/universal_reference/universal_reference/src/universal_reference at master · bg1bgst333/Sample · GitHub

WebRequest

Webページを取得する場合など、HTTPリクエストを作成するには、WebRequestを使う・・・。

WebRequest クラス (System.Net)

"http://bgstation0.com"のトップページのHTMLを取得する・・・。

f:id:BG1:20170310181329p:plain

今回は空のプロジェクトで・・・。
(コンソールでもいいんだけど・・・。)

MainClass.csを追加したら、

f:id:BG1:20170310181440p:plain

参照が足りない(というか空だから無い・・・。)ので追加する・・・。

f:id:BG1:20170310181525p:plain

Systemを追加・・・。

でMainClass.csは、

WebRequestはSystem.Net名前空間、Stream系はSystem.IO名前空間なので追加・・・。

response、stream、srはnullをセットしておく・・・。
tryの中で、まずはWebRequest.Createに"http://bgstation0.com"を指定してrequest作成・・・。
今度はrequest.GetResponseでresponseを取得・・・。
responseからresponse.GetResponseStreamでstreamを取得・・・。
しかし、これでは文字列として読み込めないので、StreamReaderのコンストラクタに渡してsrを取得・・・。
sr.ReadToEndでようやく文字列としてstrに格納・・・。
あとは、Console.Writeでstrを出力・・・。

例外が起きたら、catchブロックでex.ToString()で例外内容を出力・・・。

finallyでリソース解放・・・。
reqeustはCloseが無いみたいなので、sr、stream、responseをCloseで閉じる・・・。
(なのでMainブロックに宣言がある・・・。)

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title id="title_index">B.G-STATION</title>
  </head>
  <body id="body_index" bgcolor="#ffffff" text="#7700cc" link="0000ff" alink="ff
0000" vlink="ff00ff">
    <div id="div_titleimage" align="center">
      <img src="http://www.geocities.co.jp/bg_sta/resource/image/title.png" widt
h="460px" height="140px" />
    </div>
    <div id="div_mainmenu" align="center">
      <div id="div_item_sample">
        <a href="sample/index.html">Sample</a>
      </div>
    </div>
  </body>
</html>
続行するには何かキーを押してください . . .

こんな感じで、WebページのHTMLが取得できる・・・。

Sample/dotnet/WebRequest/WebRequest/src/WebRequest_ at master · bg1bgst333/Sample · GitHub

DateTime

日時を取得したい場合は、DateTime構造体を使う・・・。

DateTime 構造体 (System)

DateTime.Nowで現在日時情報が取得できるので、それをTimerで1秒ごとに行い、その都度Labelを更新していくような、簡単な時計を作る・・・。

f:id:BG1:20170310161947p:plain

まず、Labelを選択・・・。

f:id:BG1:20170310162020p:plain

真ん中に配置・・・。

f:id:BG1:20170310162050p:plain

小さいのでFontを調整・・・。

f:id:BG1:20170310162122p:plain

18ぐらいにする・・・。

f:id:BG1:20170310162205p:plain

Timerを追加・・・。

f:id:BG1:20170310162235p:plain

timer1を選択・・・。

f:id:BG1:20170310162312p:plain

Tickイベントのハンドラを生成・・・。

DateTime.NowでDateTime型現在時刻情報を取得できるので、それをDateTime型のdateTimeに格納・・・。
dateTime.ToStringで文字列に変換して、label1.Textに渡す・・・。
その後、timer1.Intervalを1000ミリ秒(1秒)にし、timer1.Enabledをtrueにしてタイマー開始・・・。

timer1_Tickに来るたびに、DateTime.Nowで日時を取得し、dateTime.ToStringで文字列に変換し、label1.Textに反映・・・。

f:id:BG1:20170310163112p:plain

最後にlabel1の位置をやっぱり左に寄せる・・・。(はみ出たので・・・。)

f:id:BG1:20170310162919p:plain

1秒後は、

f:id:BG1:20170310162931p:plain

ということで時計になっている・・・。

Sample/dotnet/DateTime/DateTime/src/DateTime_ at master · bg1bgst333/Sample · GitHub