タグ

ブックマーク / dev.activebasic.com (18)

  • 変わったパスとVC++のpathクラス - イグトランスの頭の中

    前回(ドライブ文字を使わないパス指定)の少し変わったパス文字列、<filesystem>のpathだとどうなるのか、気になって試してみました。 #include #include int main() { using namespace std::experimental::filesystem; path x(LR"(\\?\Volume{e96621af-7084-11e3-80b0-XXXXXXXXXXXX}\Windows\system.ini)"); std::wcout << x.root_name() << std::endl; } root_nameは、ドライブ文字を含むパスであれば、ドライブ文字の部分を返すメンバー関数です。 これをVisual C++ 2017 (15.3)でコンパイルします。実行結果はこうなりました。 \\? これはつまり、UNCのため、バックスラッシ

    変わったパスとVC++のpathクラス - イグトランスの頭の中
  • 手書きMSBuildプロジェクトをVisual Studioでビルドする - イグトランスの頭の中

    Visual Studioのプロジェクトファイル(.vcxproj, .csproj, .vbproj, ……)はMSBuildコマンドで取り扱える形式です。ご存じの方も多いでしょう。手で書いたMSBuildプロジェクトをVisual Studioでプロジェクトとして認識させることは可能なのかという疑問がわきました。そして、答えに辿り着きました。 拡張子が.vcxproj, .csproj, .vbprojなど、Visual Studioが認識するものであるなら、なんでも良い。 Build, Rebuild, Cleanという名前のターゲットがあれば、Visual Studioのメニューから呼び出せる。 MSBuildプロジェクトファイルを書く チュートリアル: MSBuild の使用を元に、Hello worldを出力するプロジェクトファイルを作ります。 <?xml version="1

    手書きMSBuildプロジェクトをVisual Studioでビルドする - イグトランスの頭の中
  • Modularized Boost(GitHubへ移行したリポジトリ)を使用する - イグトランスの頭の中

    この記事は、C++ (fork) Advent Calendar 2013の3日目です。 現在、Boostのソースコード管理はSubversionからGitへ乗り換えた上でGitHubへの移行が進められています (github.com/boostorg (Boost.org))。そこで、この記事ではGitリポジトリからBoostを使用する方法のまとめを書きます。 なお、この記事の対象はWindowsです。以下の説明でもmsysGitのgit bashとVisual Studioコマンドプロンプトが混在しています。$で始まる行はgit bash、>で始まる行はVisual C++へのパスが通ったコマンドプロンプトで実行したものです。実行速度が速いのでmsysGitで試しましたが、Cygwinでも可能だと思います。 最新版を使う まず簡単なところからです。masterやdevelopブランチ

    Modularized Boost(GitHubへ移行したリポジトリ)を使用する - イグトランスの頭の中
    craf
    craf 2014/07/24
  • RAII以外にもある後処理の書き方 - イグトランスの頭の中

    言ってしまえば、高階関数は便利だねという話でもあるわけです、それに加えてC++特有の事情があるだけで。 C++視点からのRuby紹介 // Speaker Deckの52ページ目の「ブロックを使ったRAIIっぽい機能」より。 ブロックを使ったRAIIっぽい機能 File.openメソッド ファイルを開いた後、受け取ったブロックを実行 例外の発生有無にかかわらず最後にファイルを閉じる スコープを抜けると自答的にリソースが閉じられる RAIIと共通している このような書き方はC++でも有用です。なぜなら、C++には事実上「デストラクタで例外を投げてはいけない」ためです(cf. More Effective C++ 項目11 デストラクタで発生した例外を抑える)。 そこで、ブロック引数のように関数(オブジェクト)を実引数に取る関数という方法です。後処理に失敗する可能性のある処理を抽象化する方法と

    RAII以外にもある後処理の書き方 - イグトランスの頭の中
    craf
    craf 2014/03/28
  • future::thenの値バージョン - イグトランスの頭の中

    この記事は、C++ (fork) Advent Calendar 2013の15日目です。 C++14規格レビュー勉強会#2で話に出した、future::thenの値が渡されるバージョンを書いてみました。ただし、自由関数(グローバル関数)で、仮にthen_by_valueという名前にしています。 // GCC 4.8.2, Boost 1.55 #define BOOST_THREAD_VERSION 4 #include <iostream> #include <string> #include <functional> #include <boost/thread/future.hpp> template<typename T, typename F> boost::future<typename std::result_of<F (T)>::type> then_by_value(b

    future::thenの値バージョン - イグトランスの頭の中
  • Windowsのファイル名の比較をC++で - イグトランスの頭の中

    Windowsにおいて、ファイル名の比較するならComparing Unicode file names the right way – Sorting it all Out – MSDN Blogsに従うのが良いでしょう。そこで、それをC++で実装してみました。 #include <string> #include <boost/numeric/conversion/cast.hpp> #include <boost/range/as_literal.hpp> #include <boost/range/iterator_range.hpp> #include <windows.h> bool FilenameEqualsImpl(std::wstring& lhs, std::wstring& rhs) { ::CharUpperBuffW(&lhs[0], boost::numeri

    Windowsのファイル名の比較をC++で - イグトランスの頭の中
  • Microsoft.Windows.ActCtxでWSHでもReg‐Free COM - イグトランスの頭の中

    2016年10月2日追記: Windows 8.1からこのサンプルでは動作しなくなってしまったようです。Windows Vista~7では動作します。Windows 8は未確認です。 Microsoft.Windows.ActCtxオブジェクトを使うと、レジストリに登録せずCOMコンポーネントが使えます。Activation Context APIのラッパーであり、WSHやHTAにおけるJScript/VBScriptなどのWindows APIを呼べない環境で重宝します。 用意するものは3つです。 利用したいCOMコンポーネント体(DLLなど) マニフェストファイル スクリプト体 1つ目、サンプルのCOMコンポーネントを作りました: msgbox.cpp。Visual C++ 2010(Expressでも可)でコンパイルできます。Showというメソッドを1つ持った単純なオブジェクトが

    Microsoft.Windows.ActCtxでWSHでもReg‐Free COM - イグトランスの頭の中
    craf
    craf 2012/07/09
  • C++11時代におけるクラスの書き方 - イグトランスの頭の中

    記事は、C++11 Advent Calendar 2011 : ATNDの2日目の記事です。 C++のclassは様々な使い方ができます。後発のほかの言語ではいくつもの概念に分かれているものも、C++ではすべてclassということもあります。 そこで、C++でclassを定義する際も、classと一括りにせず、自分がいったいどんなclassを書こうとしているのか明確に意識するとよいのではないだろうかと考えました。そのために、私なりのclassの分類をまとめ、この記事を書くことにしました。 これは、各々のプログラミング言語の経験により違いが出ることと思います。異論もあると思いますので、ご自身でも考えてみるとよいと思います。 以下、この記事では4種類に分類しています。 1つ目は「オブジェクト指向プログラミング (OOP) を実現するクラス」です(長いので以下OOPクラスと略します)。 vi

    C++11時代におけるクラスの書き方 - イグトランスの頭の中
    craf
    craf 2011/12/13
  • Metro styleアプリ内でMessageBoxを呼ぶとどうなるか - イグトランスの頭の中

    Metro styleアプリと言えども、Windows上で動いているアプリケーションの1つ、ちょっと手を伸ばせば、user32.dllやgdi32.dllがそこに置いてあるわけです。ダメと言われたら試したくなるものです。user32.dllのMessageBoxを呼んでみました。 #include <windows.h> // 適当に設置したボタンのクリックイベントのハンドラ typedef int WINAPI MessageBoxWType(HWND, LPCWSTR, LPCWSTR, int); auto hmodUser = ::LoadLibraryEx(TEXT("user32.dll"), nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); auto messageBoxW = reinterpret_cast<MessageBoxWType*>

    Metro styleアプリ内でMessageBoxを呼ぶとどうなるか - イグトランスの頭の中
  • WinRTとC++イテレータ - イグトランスの頭の中

    WinRTはコレクションに対するイテレータが用意されているので、その点ではC++との親和性も良いです。 この例は、Twitterのトレンド(地域:東京)を取得してきて、ListBoxに格納するコードです。 #include <collection.h> #include <boost/range.hpp> #include <boost/range/algorithm.hpp> void Application1::MainPage::Button_Click(Platform::Object^ sender, RoutedEventArgs^ e) { using namespace Windows::Foundation; using namespace Windows::Foundation::Collections; using namespace Windows::Data::X

    WinRTとC++イテレータ - イグトランスの頭の中
  • C++でも実行時の情報で最適化 - イグトランスの頭の中

    元ネタ: unnonouno: 動的型情報で仮想関数呼び出しを速くできるか Javaだと実行時の情報を使って更なる最適化ができるという話が途中にありますが、同じようなことはC++でもできます。元の記事のようにインライン展開したコードを手書きしてやる必要はありません。 というわけで、Visual C++ 2010のProfile-Guided Optimization (PGO)でいってみましょう。 元のコードを再掲します。 class Parent { public: virtual ~Parent() {} virtual void fun() = 0; }; class Child : public Parent { public: void fun() {} }; int main() { Parent* c = new Child(); for (int i = 0; i < 10

    C++でも実行時の情報で最適化 - イグトランスの頭の中
    craf
    craf 2011/06/30
  • EASTLをビルドする(CMakeでVisual Studio) - イグトランスの頭の中

    EASTLをVisual Studioで使える状態に持って行く話です。急いで書いたので、文章がいつもに増して荒っぽいですがお許しください。 EASTL単体は、githubのpaulhodge/EASTLで公開されています。しかし、これにはMakefileも何もありませんのでちょっと困ります。 そこで、forkを見てみると、CMake用のファイルを追加しているものを見つけました: take-cheeze/EASTL。CMakeを使えばVisual Studioソリューションも簡単に生成できるに違いないということで、今回はこちらを使うことにします。CMakeについては特に解説しませんので、興味ある方は各自調べてください。 git cloneしてもよいのですが、今回はとりあえずアーカイブの形でダウンロードしました。Downloadsをクリックすると、tar.gzまたはzipでダウンロードできます

    EASTLをビルドする(CMakeでVisual Studio) - イグトランスの頭の中
  • 知ってて良かった::new - イグトランスの頭の中

    今日はこんな話です。 boost::in_placeを使ってみようとした。 エラーになる例に遭遇。 Boost側を直せばいい(そのためには、こんなの誰が知っているんだという::new構文の出番) この前、Gdiplusを使っていたプログラムでちょうどin_placeとoptionalの組み合わせが使えそうだと気付きました。ちょうど信仰「ワンフェーズコンストラクティズム」やTogetter – まとめ「N3059」が世に公表されるなどという時流だったわけです。 ところが、ダメでした。謎のエラーになるのです。そのときは原因追及を諦めてboost::scoped_ptrで我慢しました。こんなコードで同じエラーを見られます。 #include <new> #include <memory> #include <boost/optional.hpp> #include <boost/utility/

    知ってて良かった::new - イグトランスの頭の中
    craf
    craf 2010/08/03
  • Asynchronous Agent Libraryを使ってみる - イグトランスの頭の中

    C++という言葉に惹かれてきた方へごめんなさい。今日はVisual C++ 2010附属のAsynchronous Agent Libraryです。これの紹介を書きたいなあと思いつつもいいサンプルが思い浮かばないと放置していたのですが、今は並列とか並行プログラミングとかがはやりなので、ウェブをあさればネタには困らないのでした。 というわけで、Go言語 (Go lang)の並列プログラミングは超かんたん。 – 医者を志すを応援する夫の日記の中から、Goなんて1ミリも知りませんが雰囲気でAsynchronous Agent Libraryを使って書き写してみました。 まずはHello, worldっぽいのです。 package main var ch = make(chan string) func g(str string) { println(str); ch <- "printed";

    Asynchronous Agent Libraryを使ってみる - イグトランスの頭の中
  • Visual C++ 2010でWin32APIプログラミングは革命を迎える - イグトランスの頭の中

    久々なので、大げさな題を付けました。 新しいWindowsでしか実行できない関数を使うときの1つの手段として、GetProcAdressがあります。C++0xのdecltypeは、そのやり方を大きく変えます。 HMODULE hmodKernel = GetModuleHandle(TEXT("kernel32")); typedef decltype(CancelSynchronousIo)* PCancelSynchronousIo; PCancelSynchronousIo pCancelSynchronousIo = reinterpret_cast<PCancelSynchronousIo>( GetProcAddress(hmodKernel, "CancelSynchronousIo")); 今までだったら、MSDNライブラリあるいはヘッダファイルを直接見るなどして、type

    Visual C++ 2010でWin32APIプログラミングは革命を迎える - イグトランスの頭の中
    craf
    craf 2009/06/09
    これ思いつかなかった
  • エクスプローラを終了する - イグトランスの頭の中

    たまに、Explorer.exeのプロセスを終了させたいときがあります。タスクマネージャから強制終了させてもいいのですが、たしか終了させる正規の手段があったはず、とTortoiseSVN 1.54のインストール後、探しました。 意外と手こずりましたが、MSのKBにありました:Visual C++ を使用して Windows シェル拡張をデバッグする方法。 Windowsの終了ダイアログボックスを表示させ、Alt + Ctrl + Shiftを押しながら「いいえ」をクリックです。 ちなみに、Vistaなんかだとデスクトップまたはタスクバーにフォーカスを当ててAlt + F4でWindowsの終了のダイアログボックスを表示できます。 エクスプローラを復活させるにはタスクマネージャ (Ctrl + Alt + Del) から「ファイル名を指定して実行」など、強制終了させた時と同じ要領で行います。

    エクスプローラを終了する - イグトランスの頭の中
  • プロンプトウィンドウ貼り付けの謎 - イグトランスの頭の中

    プロンプトウィンドウでは、Ctrl+Vによる貼り付けの処理を、WM_CHARメッセージで文字コード (WPARAM)が&h16のときに行うようになっています。なぜこれでできるのか、さっぱり訳がわかりませんでした。山さんに聞いてもそれを書いたのは昔のことで覚えていないと言われる始末です。 ところが、学校から借りていたC#によるプログラミングWindows上を読んでいると疑問が氷解しました。 .NET FrameworkにおいてWM_CHARに相当するのはControl.OnKeyPressメソッド、Control.KeyPressイベントですが、そこにCtrl+AからCtrl+Zの入力は0x0001から0x001Aの制御文字の入力になると書かれてあるのです。そう、プロンプトウィンドウが行っていたのはこれだったのです。ちなみに、コマンドプロンプトで^H (Ctrl+H)を打つとバックスペース

    プロンプトウィンドウ貼り付けの謎 - イグトランスの頭の中
  • ムーブセマンティクスと右辺値参照 - イグトランスの頭の中

    話のネタはありながら、気が付けば木曜日となり、どうやら毎週木曜日に書くという習慣が自分の中に根付いたようです。 さて今日はC++の話です。ActiveBasicもバージョン5で色々と変わりそうですが、C++も目下新規格の制定に向けて話が進んでいます。その新規格は現在のところ、C++0xと呼ばれています。勿論200x年中の制定を見込まれているからですが、最近ではC++09という言葉もちらほら見かけ始めている気もします。 なお、そんなC++0xの様子はC++の標準化委員会のページで窺い知ることができます。 http://www.open-std.org/jtc1/sc22/wg21/ JTC1/SC22/WG21 – The C++ Standards Committee その中でも今回紹介したいのはムーブセマンティクス (move semantics)と右辺値参照 (rvalue refer

    ムーブセマンティクスと右辺値参照 - イグトランスの頭の中
    craf
    craf 2007/02/28
  • 1