Egtra さん プロフィール

  •  
Egtraさん: イグトランスの頭の中(のかけら)
ハンドル名Egtra さん
ブログタイトルイグトランスの頭の中(のかけら)
ブログURLhttp://dev.activebasic.com/egtra/
サイト紹介文最近はC++についてが多いです。ほかActiveBasicについてぼちぼちと。C#やRubyなんかも触ります。
自由文Windowsプログラミングに関することの割合が多いです。
参加カテゴリー
更新頻度(1年)情報提供39回 / 365日(平均0.7回/週) - 参加 2013/05/26 05:38

Egtra さんのブログ記事

  • リソーススクリプトで最初にincludeするヘッダの選択
  • 手書きのリソーススクリプトなら先頭で、Visual C++プロジェクトでなら「読み取り専用ヘッダーファイル」で指定するヘッダーファイルの話の続きです。前回(リソース関係のヘッダーファイルまとめ)、いろんなリソーススクリプト用のヘッダーファイルを紹介しました。今回は、私の選択基準を書きます。MFCを使用するWTLを使用するnoyesVC++ 2012以上を使用するnoyesyesnoアプリでMFCを使っているなら、MFCのを使います。アプリでWT [続きを読む]
  • リソース関係のヘッダーファイルまとめ
  • 私が知る、リソーススクリプト用のヘッダーファイルのまとめです。afxres.hMFCのヘッダーファイルです。winres.hをインクルードしています。リソースID用の定数を多数定義しています。その中にはAFX_IDW_TOOLBARなどAFXで始まるものもあれば、ID_FILE_NEWのように汎用的に使えそうなものもあります。atlres.hWTLのヘッダーファイルです。Visual Studioの付属品ではありません。winresrc.hをインクルードしています。afxres.hのよう [続きを読む]
  • winres.hがWindows SDKに移動していた
  • リソース関係のヘッダーファイルwinres.hの話です。これはMFCのヘッダーファイルだったはずですが、少し前からWindows SDKに収録されるようになりました。Visual C++ 2010では、MFC(とATL)のヘッダーファイルがあるフォルダにありました。C:Program Files (x86)Microsoft Visual Studio 10.0VCatlmfcincludeです。それ以前のバージョンも同様です。Visual C++ 2012以降、MFCのフォルダにはwinres.hがありません。代わりにWindows [続きを読む]
  • Boostのなんにもしないミューテ(ッ)クス
  • 以下のコードのように、実際には何も行わず、ただミューテックスの要件を満たすだけの実装は簡単に作れるでしょう。Null Objectパターンの一種と言えますよね。class null_mutex{ void lock() {} void try_lock() {} void unlock() {}};Boostには、そんなクラスがなんだかあちこちにあるようです。Boost.Signals2: Class dummy_mutex (boost::signals2::dummy_mutex)Boost.Interprocess: Class null_mutex (boost::interprocess [続きを読む]
  • VC++ 2015のcodecvtでリンクエラーになる問題の回避策
  • Visual C++ 2015および2017 RCでは、の各クラステンプレートにchar16_tやchar32_tを組み合わせるとリンクエラーになるという問題があります。今回、これに対する条件付きのWorkaroundについて書きます。まずは、エラーになるコードの例を提示します。#include #include #include #include int main(){ std::wstring_convert, char32_t> converter_utf32; std::wstring_convert, char16_t> converter_utf16; std::string u8str = [続きを読む]
  • VC++でstd::get_timeがなんかダメ
  • Visual C++ 2015と2017 RCで、以下のプログラムが期待どおりに動きませんでした。#include #include #include
    #include int main(){ std::istringstream s("20170110"); std::tm x = {}; s >> std::get_time(&x, "%Y%m%d"
    ;); char buf[255]; strftime(buf, sizeof(buf), "%Y-%m-%d", &x); std::cout %Yで2017だけパースされることを
    期待しているのですが、Visual C++の実装では、20170110まで読み込んでしまうようになってい [続きを読む]
  • glibcのwchar_tがUCS-4であることを確認した
  • 主にLinuxで使われるGNU C Library (glibc)では、wchar_tをUCS-4 (UTF-32)固定としている、そう私は認識しています。しかし、ずっとその根拠を確かめずにそう思い込んでいる状態だったので、気になって調べました。マニュアルにそのような記載が無いかと探した結果、The GNU C Library: Selecting the Conversionに以下の記述を見つけました。The wide character set is always UCS-4 in the GNU C Library.このほか、LinuxのMan p [続きを読む]
  • tmからtime_tにUTCで変換する関数を探した
  • 次の表を見てください。あるいはでtime_tとtm構造体との変換を行う関数をまとめました。time_t→tm構造体tm構造体→time_t現地時刻localtimemktimeUTCgmtime?表の「?」の部分、UTCでtm構造体からtime_tに変換する関数、それがCおよびC++の標準ライブラリにはありません。仕方ないので、非標準でもいいから何かないかと探しました。どうやら、Unix系の一部にはtimegm、Visual C++には_mkgmtimeという関数があることが分かりました [続きを読む]
  • サイズ別に整数型を多重定義したかった
  • この記事は、初心者C++er Advent Calendar 2016の23日目の記事です。WindowsのVisual C++でこんなコードを書き始めたんです。#include #include void f(std::uint8_t) {}void f(std::uint16_t) {}void f(std::uint32_t) {}void f(std::uint64_t) {}符号無し整数型をすべて網羅するよう、関数fを多重定義したわけです。さらにコードを書き進めます。int main(){ DWORD x = 12345; f(x);}こんなコードを書いたら、コンパイルエラー [続きを読む]
  • Boost.Threadの排他制御を補助する関数
  • この記事は、C++ Advent Calendar 2016の12日目の記事です。std::lock_guardクラステンプレートは、std::mutexなどのlockとunlockをRAII化するものとして欠かせません。std::mutex m;std::lock_guard guard(m);しかし、このようにテンプレート実引数としてミューテックスの型を指定しなければならないのが少しです。そこで、Boost.Thraedの中からこの点少し便利になったものを2つ紹介します。どれもヘッダーのみ、ビルド不要で使え [続きを読む]
  • 配列でないオブジェクトに対するポインタ演算
  • この記事は、C言語 Advent Calendar 2016の11日目の記事です。前回の記事、十六進数で文字列に変換する (Boostのhex関数)では、uint32_t型の変数xを定義し、&x + 1というポインタ演算を行うC++のコードを載せました。xは配列でもなんでもありません。果たしてこんなことして良いのでしょうか、というのが今回の話です。Cにも当てはまる話なので、C言語 Advent Calendarに乗っかせていただくことにしました。結論を述べると、問題あ [続きを読む]
  • 十六進数で文字列に変換する (Boostのhex関数)
  • この記事は、初心者C++er Advent Calendar 2016の4日目の記事です。C++で、数値を文字列に変換する関数といえば、まずはstd::to_string (cpprefjp)です。ところが、この関数は、十進法で結果が出てきます。ほかによく使うものと言えば、十六進法です。というわけで、十六進法で文字列に変換する方法の話です。標準ライブラリにいい感じのものがないので、Boostに頼ります。使いますのは、hexという単純な名前の関数です。#include [続きを読む]
  • wstring_convertやwbuffer_convertでwchar_tとcharとを変換する
  • wstring_convertやwbuffer_convertを使ってワイド文字列とマルチバイト文字列との変換を実現する方法を考えました。wstring_convertやwbuffer_convertは、前回(VC++のwstring_convertやwbuffer_convertがちょっと変)書いたように、その名前に反してワイド文字との変換に使えるようになっていません。std::use_facetの戻り値を使えるように作られていないためです。そこをどうにかできないかとずっと考えていて、やっと思いつきま [続きを読む]
  • VC++のwstring_convertやwbuffer_convertがちょっと変
  • std::wstring_convertとstd::wstring_bufferって、std::localeと組み合わて使うのが難しいです。そんなわけで、その名前とは裏腹にstd::wstring (wchar_t)との組み合わせには使いづらいなあと思っています。が、しかし、Visual C++はその辺、規格をいい感じにやっちゃって(無視して)いて、使えるようになっていることに気付いてしまいました。このコード、コンパイルできてしまいました。もちろん、実行すればちゃんと動きます。 [続きを読む]
  • Boostで型名をデマングルする
  • GCCやClangでtypeinfo::name()の結果を分かりやすい名前に変換(デマングル)するにあたり、Boostに便利なクラス・関数があります。まずは、scoped_demangled_nameクラスです。std::type_infoから構築し、getメンバー関数でデマングルした文字列が得られるというものです。#include #include #include int main(){ // コンストラクタには、const std::type_info&型の仮引数が1つある。 boost::core::scoped_demangled_name name( [続きを読む]
  • ATL::CAtlExeModuleTのバージョン非互換を見つけた話
  • ATL::CAtlExeModuleTを使ったコードを様々なバージョンのVisual C++でコンパイルしていたところ、非互換な変更を見つけました。問題を見つけたコードとその症状次のコード、Visual C++のバージョンを上げると動かないという現象に遭遇しました。#include #include #include #define nullptr NULLclass Module : public ATL::CAtlExeModuleT{public: HRESULT Run(int showCmd) { ATL::CComPtr obj; HRESULT hr = CoCreateIn [続きを読む]
  • ATL::CAtlExeModuleT::WinMain関数を使う例
  • ATLのCAtlExeModuleTクラステンプレートには、WinMain関数があります。これを使うウィンドウアプリのサンプルコードを書いてみようと思いました。以前書いた空のウィンドウを表示するだけのWindowsアプリケーション (WTL)をもとに書いています。#define UNICODE#define _UNICODE#define WINVER 0x0501#define _ATL_XP_TARGETING#define _ATL_NO_COM_SUPPORT#define _ATL_APARTMENT_THREADED#define _ATL_NO_AUTOMATIC_NAMESPACE#de [続きを読む]
  • Visual C++コード分析を支えるSALという題で話をしてきました
  • Boost.勉強会 #21 札幌でLTとして話をしてきました。Visual C++のSAL (source code annotation language)についてです。 Visual C++コード分析を支えるSAL from egtra このスライドはCreative Commons ― 表示 ? 継承 4.0 国際 ― CC BY-SA 4.0です。ダウンロードはこちらです。Visual C++コード分析を支えるSAL (PDF)Visual C++コード分析を支えるSAL (PPTX)その後、尋ねられた質問の回答を以下書いておきます。こういう低水 [続きを読む]
  • WebBrowserコントロールでJavaScriptほか色々禁止する (3) DISPID_AMBIENT_DLCONTROLその1
  • 引き続き、ATLでWebBrowserコントロールで使用する場合にJavaScriptその他を禁止する方法の話です。3回目からは、ちょっと違うやり方、DISPID_AMBIENT_DLCONTROLです。インターネット上で検索すると、DISPID_AMBIENT_DLCONTROLを使うやり方のほうが多く見受けられるのですが、ちょっと問題があって後回しにしていました。その理由は、「Visual C++ 2013以降だと、ATL::CAxWindowと組み合わせての利用が少し困難だから」です。とい [続きを読む]
  • ATL::IDispEventSimpleImplでIDispatchを実装する
  • 引き続き、C++でIDispatchを実装する話です。ATLにおいて、簡易的なIDispatchの実装クラスとしてATL::IDispEventSimpleImplがあります。本来の目的は、IConnectionPointなどによるイベント処理の実装です。イベントの通知に使われるインタフェース(アウトゴーイングインタフェース)がIDispatchベース (dispinterface)であることがよくあり、その実装のためのものです。しかし、今回はただIDispatch (dispinterface)実装のためだ [続きを読む]
  • CreateDispTypeInfoとATL::IDispatchImplを使ってみる
  • 前回のCreateDispTypeInfoとCreateStdDispatchを使ってみるを書いた後、ATL::IDispatchImplとの組み合わせでも作れるのではないかと思い、やってみることにしました。#define _ATL_NO_AUTOMATIC_NAMESPACE#include #include #include #include #include class Module : public ATL::CAtlExeModuleT {};Module module;// ダミー// {34F91FCB-7237-4EA7-B5E5-3FB7FDDD87AC}static constexpr CLSID CLSID_Hoge = { 0x34f91fcb, 0x7237 [続きを読む]