Egtra さん プロフィール

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

Egtra さんのブログ記事

  • ドライブ文字を使わないパス指定
  • Windowsの絶対パスと言えば、C:Windowsのようなドライブ文字で始まる表記を思い浮かべることと思います。しかし、ドライブ(ボリューム)を指定する表記はほかにもあります。ボリュームGUID各ボリュームに対するGUIDです。mountvolコマンドで確認できます。ディスク番号・パーティション番号による表記正式な名称は分かりませんが、Harddisk0Partition1のような文字列です。それぞれの番号は、diskpartコマンドやWMIなどで確認でき [続きを読む]
  • VC++ filesystemのパーミッション取得の実装
  • C++ filesystemには、パーミッションを取得・設定する機能があります。そんなわけで、たとえばこ
    れをその辺のUnix系システムでg++を使ってコンパイル・実行すれば、755という出力が得られるはず
    です。#include #include int main(){ using namespace std::experimental::filesystem; auto perm = status("/bin/sh").per
    missions(); std::cout (perm) さて、これWindowsだとどうなるのだろう?と思うわけです。試してみました
    。 [続きを読む]
  • System32優先でDLLを探す指定を試してみた
  • CreateProcess時、PROC_THREAD_ATTRIBUTE_MITIGATION_POLICYでプロセスに対する一部の挙動を変更することが可能です。その中にWindows 10のいつからか、DLLの検索パスについての定数が増えています。前々から気になっていたので、試してみました。その定数は、UpdateProcThreadAttributeに記載のある以下です。PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_DEFERPROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD [続きを読む]
  • ワイド文字列でファイル名を指定する機能がC++標準に入るようだ
  • 以前より、Visual C++のファイルストリーム(basic_fstream, basic_ifstream, basic_ofstream)には、独自拡張が存在しました。ファイルパスをワイド文字列で指定できる実引数のコンストラクタとopenメンバー関数の多重定義です。理由は、WindowsのAPIがUTF-16 (wchar_t)でファイルパスを扱うためです。さて、C++17でこれが標準に取り込まれることに気付きました。こうなったのは、std::filesystem::pathの影響です。代表として、C++ [続きを読む]
  • filesystem::pathの文字の型
  • 以下のpathクラスについてです。これらが内部で使用する型は環境によって異なるという話です。C++17で標準ライブラリに入るstd::filesystem::pathBoost.Filesystem v3のboost::filesystem::pathこれらpathクラスは、内部では文字列でデータを保有しています。この文字列は、実行環境のファイルシステムでネイティブに使用されるエンコーディングとなります。そのため、実行環境によって、使用する文字の型も異なります。Boostの場 [続きを読む]
  • WinHTTPがHTTP/2に対応した (Windows 10 1607)
  • WinHTTPにHTTP/2の対応が入ったようです。そこで、簡単にですが確かめてみました。WinHTTPは、Windowsの汎用的なHTTPとWebSocketのAPIです。そんなわけで、自身でときどき使ったり、使っているアプリをたまに見かけたりします。フラグをMSDNライブラリで見つけたこの前、WinHttpSetOption関数で指定するOption Flagsを見ていたところ、WINHTTP_PROTOCOL_FLAG_HTTP2というものが増えていることに気付きました。WINHTTP_OPTION_ENABL [続きを読む]
  • phpBB 3.2を日本語化して使う
  • 表(?)の掲示板https://www.activebasic.com/forum/では、phpBBが使われています。そのphpBBを最新版3.2に更新しました。そのときやったことのまとめです。phpBB 3.2ではスタイルprosilverが標準となっていますが、ここでは以前より使い続けているsubsilver2を引き続き使い続けています。以下の手順もsubsilver2に絞ったものとなっています。公式サイトのphpBB ? Download phpBB 3.2からダウンロード。subsilver2スタイルの導入。p [続きを読む]
  • CreateWindow関数にはHINSTANCEが必要
  • 私がWindows APIプログラミングを始めた頃から、MSDNライブラリのCreateWindow関数にはこんなことが書いてありました。従って、NT系ならここはNULLで良いのだと、最近まで信じていました。hInstanceWindows 95/98:ウィンドウに関連付けられたモジュールのインスタンスハンドルを指定します。Windows NT/2000:このパラメータは無視されます。ところが、最近こんなのを見つけたんです: What is the HINSTANCE passed to CreateWind [続きを読む]
  • リソーススクリプトで最初に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 [続きを読む]