FreeBSD 10.0はstd::localeが使えるようになった(FreeBSD 10.0-RELEASE登場記念)
先日、FreeBSD 10.0-RELEASEが登場しました(参考: SourceForge.JP Magazine)。今回、大きな変更点としてClangとlibc++の標準採用があります。これにより、以下のプログラムが動作するようになりました。// c++ helloworld.cppまたはclang++ helloworld.cpp #include <iostream>...
View ArticleATLでCOMインタフェースを実装するコード例
ATLを使ってCOMオブジェクトを作る最小コードの例です。1アプリケーションの中でCOMオブジェクトの作成が必要になったという想定です。すなわち、この例にクラスファクトリやOBJECT_ENTRY_AUTOは登場しません。#define _ATL_NO_AUTOMATIC_NAMESPACE #include <iostream> #include <atlbase.h>...
View ArticleATLでCOMオブジェクトを作る関数を作る
前回(ATLでCOMインタフェースを実装するコード例)の続きです。ATL::CComObject<>::CreateInstanceに注目していきます。...
View ArticleATLでコンストラクタに引数を渡しつつCOMオブジェクトを作る
ATLでCOMオブジェクトを作る話の続きです。今回で一応終わります。ATLでCOMインタフェースを実装するコード例ATLでCOMオブジェクトを作る関数を作るATLでCOMインタフェースを実装するC++クラスを作っていて遭遇した、次なる壁は引数を持つコンストラクタでした。ATL::CComObjectRootExから派生したクラスで、引数を取るコンストラクタを持たせたいと思いました。しかし、そんなこと...
View ArticleCComPtrのバグが直っていた
以前書いたCComPtrをCOMインタフェースでないクラスに対して使うのは要注意について、Visual C++ 2012でこの問題が直っていました。ソースコードを見たところ、代入演算子の実装が改善されていました。すなわち、問題だったAtlComPtrAssignを使用しないようになっていました。T* operator=(_Inout_ const CComPtr<T>& lp)...
View ArticleCOMで弱参照を実現する
WinRTには弱参照のCOMインタフェースがあります。WinRTに限らず使いたいのですが、あいにくWinRT専用の作りだったので、代替品を自作しました。IWeakReferenceSourceIWeakReferenceこれと同名のインタフェースとメソッド(ただし引数の型が少し異なるもの)を作ったわけです。そして、それに対する実装も作りました。...
View ArticleCOMで弱参照を実現する(マルチスレッド対応)
前回(COMで弱参照を実現する)の続きで弱参照の実装、マルチスレッド対応編です。今回のコードは前回からがらりと変わっています。今回はクラスObjectWithWeakReferenceにすべてまとめました。対象オブジェクトのメモリ領域IWeakReferenceSourceの実装IWeakReferenceの実装...
View Articleアパートメント(スレッド)を越えても安全に持ち運びできるVARIANTラッパーを作った
アパートメントを越えてVARIANTを持ち運びするためのクラスを書きました。名前はFreeThreadedVariantです。インタフェースへのポインタにおけるATL::CComGITPtr(リンク先:MSDNライブラリ)のように使えるものが欲しくて、これを作りました。こんなコードが書けるようになります。std::cout << "マーシャリング不要な型" <<...
View Articlegoto fail、到達しないコードにVC++で警告を出す
ここ最近、Appleの例のバグで大盛り上がりですね(Apple史上最悪のセキュリティバグか、iOSとOS XのSSL接続に危険すぎる脆弱性が発覚──原因はタイプミス? | アプリオ)。さて問題になったようなコード、Visual C++でも警告は出るよね、という確認です。int ReadyHash(void*, void*); int SSLHashSHA1_update(void*, void*);...
View ArticleVisual C++ 2005でとを使う
今回の裏テーマ、「Boost.AtomicをVisual C++ 2005で使用する」です。Visual C++ 2005でそこそこ新しいWindows SDKを併用すると、<windows.h>と<intrin.h>で衝突して使えない問題の解決法です。このように、#defineでいい感じの宣言になるように細工してからincludeします、めでたしめでたし。#include...
View ArticleATLENSURE_SUCCEEDEDにはVC++ 2012から副作用のある式も置ける
ATLにATLENSURE_SUCCEEDEDというマクロがあります。これはHRESULT値を1つ引数に取り、その値が失敗を表すものだったら例外を投げるというものです(例外を投げるはデフォルトの挙動であり、変更可能)。HRESULT hr = CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);...
View ArticleRAII以外にもある後処理の書き方
言ってしまえば、高階関数は便利だねという話でもあるわけです、それに加えてC++特有の事情があるだけで。C++視点からのRuby紹介 // Speaker Deckの52ページ目の「ブロックを使ったRAIIっぽい機能」より。ブロックを使ったRAIIっぽい機能File.open('some_file') do |file| # 処理...
View ArticlefriendとtemplateによるVisual C++でしか動かないコード
今日のテーマは、Visual C++だけでコンパイル・実行できる不思議なコードです。(nullptrさえ直せば)2005から2013までいずれでも通用します。#include <iostream> void f() { std::cout << "f" << std::endl; } void g() { std::cout << "g"...
View ArticleVisual C++の不思議なfriend(その2)
間が空きましたが、前回(friendとtemplateによるVisual C++でしか動かないコード)の続きです。今度は分割コンパイルです。前回消化した謎の挙動とテンプレートの明示的実体化を使って、オブジェクトファイル間の依存を断ち切るコードを書きます。まずは、2ファイル中1つ目、実装を書く側です。#include <iostream> void f() { std::cout...
View ArticleIMEを無効にすることとスクリーンキーボード
今日は、特定のWin32コントロール(ウィンドウ)でIMEを無効化する方法についてです。近頃はタブレットも珍しくない存在になりました。そこで、タブレットにおいてなくてはならないWindowsのスクリーンキーボードを意識してみたという話です。 従来の方法とその問題点これまで、IMEを無効にするにはマイクロソフトのKB171154(特定のウィンドウを IME...
View Articleダイアログをメイリオなどで表示する
Visual Studioのリソースエディタで特に何もせずダイアログを作る(※)と、かな漢字の表示には最新のWindows 8.1でもMS UI Gochicが使用されます。これをメイリオやMeiryo UIなどにしようというのが今日の内容です。※ なお、何も考えずに作るダイアログはDS_SHELLFONTかつ”MS Shell Dlg”ということです。MS Shell...
View ArticleHTTPステータスコードをHRESULTで表現する
Winerror.hなどを見ていると、HTTPステータスコードを表現するHRESULT値があることに気付きます。最初にネタばらししてしまうと、すべてMAKE_HRESULT(SEVERITY_ERROR, FACILITY_HTTP,...
View Articleサービスから昇格した権限のプロセスを起動する
Windowsサービス内から、UACダイアログを表示せず昇格した権限を持つプロセスを起動することはできないだろうかと試してみました。結果、以下の条件の下で実際に可能であることを確認しました。自身(起動する側)Local...
View ArticleVisual C++でしか動かないコード:明示的特殊化
Visual C++でしかコンパイルできないコードその2です。今回は「メンバーテンプレートの明示的特殊化をクラス定義内に書く」です。class hoge { template<typename T> class piyo {}; template<> class piyo<int> {}; };GCCやClangではコンパイルエラーになります。一方、Visual...
View ArticleBoostのunique_ptrをstd::unique_ptrのようにする
今日は、Boost.Interprocessに存在するunique_ptrをstd::unique_ptrのように使う方法です。Boostにもunique_ptrが存在します: Boost に std::unique_ptr の移植がないかな、と思ったら有った。 –...
View Article