アパートメントが死ぬときオブジェクトも死ぬ
本記事は、COM Advent Calendar 2014 – Qiitaの15日目の記事です。マーシャリングされたオブジェクトの寿命は、アパートメントに縛られます。アパートメントが終わったら、そのアパートメントにいるオブジェクトにはアクセスできなくなります。今度のプログラムは、STAのスレッドを(1) TerminateThread (2)...
View Articleマーシャル禁止のオブジェクト
本記事は、COM Advent Calendar 2014 – Qiitaの17日目の記事です。前回のマーシャリングできないインタフェースの話に続いて、今回はオブジェクト自らがマーシャリングの禁止を宣言する話です。マーシャリングできないことを表明するインタフェースINoMarshalがWindows 8で追加されました。早速サンプルコードを出します。#include <iostream>...
View Article今いるアパートメントの種類を知りたい
本記事は、COM Advent Calendar 2014 – Qiitaの18日目の記事です。今日は、現在実行中のスレッドのアパートメントの種類を知る方法です。まず、Windows 7からCoGetApartmentType関数があります。それとATLにATL::AtlGetApartmentType関数があります。#include <iostream> #include...
View ArticleOBJREFモニカー
本記事は、COM Advent Calendar 2014 – Qiitaの20日目の記事です。OBJREFモニカーはオブジェクトへの参照を扱うモニカーです。文字列で表現できるため、プロセス間での受け渡しに使用できます。 サンプルプログラム:...
View ArticleWinRT APIを使ってみる
本記事は、COM Advent Calendar 2014 – Qiitaの24日目の記事です。最後(CoUninitializeの前)に、Windowsストアアプリ用APIであるWindows Runtime API (WinRT API)を使うサンプルコードも取り上げようと思いました。「WinRT APIはCOMなんだよ」を示すべく、ネイティブのC++でWinRT...
View ArticleCoInitializeとCoUninitializeが呼び出されたことを知る
本記事は、COM Advent Calendar 2014 – Qiitaの25日目の記事です。今日で最後です。COMには、CoInitializeやCoUninitializeが呼び出されたことの通知を受け取る手段が用意されています。IInitializeSpyおよびCoRegisterInitializeSpyそしてCoRevokeInitializeSpyです。#include...
View ArticleVC++でstd::threadから数値のスレッドIDを取り出す
今回はVisual C++限定の話です。VC++のstd::thread::id型オブジェクトは、boost::lexical_castで整数型に変換できます。Windows APIなどに渡す場合に使えます。#include <iostream> #include <thread> #include <windows.h> #include...
View ArticleC++の正規表現は全角文字にマッチする(かもしれない)
C++の正規表現はロケールが考慮されます。初期状態はCロケールなのでASCIIの範囲にしかマッチしませんが、その他のロケールを使用すれば、たとえばワイド文字で全角文字にマッチすることもあります。途中の過程を飛ばして述べてしまえば、メタ文字の\s, \d, \wのマッチはstd::localeのctypeで判定されます。言い換えれば、std::localeを引数に取るisspace, isdigit,...
View ArticleWindows 8.1再起動時の「オプションの選択」画面をAPIで呼び出す
Windows 8~8.1で、完全なシャットダウンやセーフモードで起動したいときなどに使う「オプションの選択」の画面(右側画像のあれ、チャーム→PC設定→……などの手順で再起動すると出てくる)をWindows...
View Articlefstreamを返す関数
今更ですが、C++11からはfstreamやstringstreamを関数の戻り値にできるようになりました。#include <iostream> #include <fstream> std::ifstream open_config_file() { std::ifstream s("app.conf");...
View ArticleSetCoalescableTimerに置き換えるべきかと思った話
要約すると「SetTimerのすごい版、SetCoalescableTimerが出た。けど、わざわざSetTimerから移行する必要はないと分かった」というお話です。Windows 8よりSetTimerの系統にSetCoalescableTimerが増えていることに気付きました。Windows...
View Article標準出力のパイプ経由でCOMインタフェースを受け渡す
プロセス越しにCOMインタフェースを受け渡す話、久しぶりにします。今度はCoMarshalInterfaceとCoUnmarshalInterfaceです。この間でのデータの受け渡しにCreatePipeによるパイプを使いました。今回のサンプルコード、OBJREFモニカーのときとは少し処理の流れが異なります。親プロセスp.exe (p.cpp): 子プロセスc.exe...
View Article保護モードよりもう少しだけ制限の強いプロセスを作る
ちょっと制限のあるプロセスを作ろうと思いました。Integrity Levelを低にするCreateRestrictedTokenのDISABLE_MAX_PRIVILEGE |...
View Article