2015年03月15日

Visual Studio 2010 における例外

Visual Studio を起動した際に以下のような例外メッセージが出ることがありました。
vs_error
log ファイルを見ても、それらしい原因がわかりませんでしたが下記のサイトにある方法で解決できました。
  •    Clear your %temp% folder, they are all temp files. Ignore those files you cannot delete.
  •    We may need to reset templates. Open Windows Explorer, and navigate to  <Visual Studio Installation Path>\Common7\IDE (by default is C:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE); 
  •    Delete the ItemTemplatesCache, ProjectTemplatesCache folder; 
  •    Open Visual Studio Command Prompt (2010) under Start menu -> All Programs -> Microsoft Visual Studio 2010 -> Visual Studio Tools (run it with Administrator privilege: right-click the program -> Run as administrator); 
  •    Run the devenv /InstallVSTemplates switch
  •    Run the devenv /Setup switch
  • 最初の一つ目にあたる%temp%フォルダの中身を削除することで例外が出なくなりました。

    理由としては、フォルダにファイルがたくさんありすぎたようです。

    例外が出ていたときは6GBほど利用していました。

    もし同じようなことがあれば、お試しあれ



    rabbitcats at 22:30|PermalinkComments(0)TrackBack(0)コンピュータ | 雑記

    2014年11月26日

    動的にアイコンを変えられるツールバー

    C++ でMFC を利用してデスクトップアプリケーションの開発をしていた時の覚書です。
    画面を切り替えて使うアプリケーションなどでは、画面ごとに似たような機能を持ったツールバーを用意することがあると思います。
    その場合に一つのツールバーで見た目と機能を切り替えると便利かと思ったので、試してみました。

    下準備

    CMFCToolBar を継承した新しいToolBar クラスを作成し、下記の関数をオーバーライドします。

    BOOL CMyToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID, BOOL bLocked,
            UINT uiDisabledResID, UINT uiMenuDisabledResID,  UINT uiHotResID)
    {
        m_uiOriginalResID = 0;
        return CMFCToolBar::LoadToolBar(uiResID, uiColdResID, uiMenuResID, bLocked, uiDisabledResID, uiMenuDisabledResID, uiHotResID);
    }
    
    BOOL CMyToolBar::LoadToolBarEx(UINT uiToolbarResID, CMFCToolBarInfo& params, BOOL bLocked)
    {
        m_uiOriginalResID = 0;
        return CMFCToolBar::LoadToolBarEx(uiToolbarResID,params,bLocked);
    }
    

    実際にはLoadToolBar は内部でLoadToolBarEx を呼び出しているので、LoadToolBarEx だけオーバーライドすればできると思います。
    動的にアイコンを変えたい場合にはm_uiOriginalResID の値を0 にしてあげる必要があります。
    これはCMFCToolBar::LoadToolBarEx 内でビットマップをロードするLoadBitmapEx と同じ条件式のところで、m_uiOriginalResID の値を見ているからです。

    if (m_uiOriginalResID != 0 || LoadBitmapEx(params, bLocked))
    

    afxtoolbar.cpp のLoadToolBarEx 内でこのようにコードが書かれています(VisualStudio12.0で確認)。 m_uiOriginalResID が0 以外の場合ではLoadBitmapEx が呼び出されないため、変更したいツールバーのビットマップが読み込まれないことになってしまいます。

    使い方

    使い方は簡単で、いつも通りツールバーを作成します。

    m_pMyToolBar->CreateEx(
        this,
        TBSTYLE_FLAT,
        WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,
        CRect(0, 0, 0, 0),
        MYTOOLBAR1_ID
        );
    m_pMyToolBar->LoadToolBar(IDR_MYTOOLBAR1, 0, 0, TRUE);
    m_pMyToolBar->SetWindowText(_T("MyToolbar1"));
    m_pMyToolBar->SetControlBarStyle(m_pMyToolBar->GetControlBarStyle() & ~AFX_CBRS_CLOSE);
    
    this->DockPane(m_pWndToolBar.get());
    

    そのあとに変更したいタイミング(たとえばツールバーのアイコンをクリックしたタイミングなど)で下記のコードを呼び出します。

    m_pMyToolBar->CleanUpLockedImages();
    m_pMyToolBar->LoadToolBar(IDR_MYTOOLBAR2, 0, 0, TRUE);
    m_pMyToolBar->AdjustLayout();
    m_pMyToolBar->AdjustSizeImmediate();
    

    これで無事にツールバーを変更することができます。

    おまけ

    実は上に書いたコードには落とし穴がありました。
    ツールバーを作成した後に
    m_pMyToolBar->SetControlBarStyle(m_pMyToolBar->GetControlBarStyle() & ~AFX_CBRS_CLOSE);
    でツールバーの閉じるボタンを無効に設定しているのですが、実際には閉じるボタンは表示されてしまいます。

    CMFCToolBar::CanBeClosed

    CanBeClosed で閉じることができるかどうかを判断できるのですが、CMFCToolBar は常にTRUE を返すようです。
    ちょっと意味が分からないですね。
    そこで、とりあえず下記のようにオーバーライドすることで設定した値で判断するように変更できます。

    BOOL CMyToolBar::CanBeClosed() const
    {
        return CBasePane::CanBeClosed();
    }
    

    これで解決できるのですが、良いのかどうか・・・



    rabbitcats at 00:50|PermalinkComments(0)TrackBack(0)C++ 

    2014年10月16日

    Sleipnir4.3.9のchromiumツールバー表示問題について

    sleipnir439

    windows8.1 の環境でsleipnir のバージョンを挙げた際に上記画像みたいにツールバーが増えてしまったので、その対応を行いました。

    Sleipnir のフォーラムを探してみると、同じような現象になった方がおり、対処法が回答されていたので同じように行いました。

    4.3.9.4000アップデート時の問題について - Fenrir User Community 

    フォーラムの内容が消えてしまうと困るので、以下に対処法を引用します。 
    1.Sleipnirを終了する 

    2.以下のファイルを開く 

    C:\Users\<ユーザー名>\AppData\Roaming\Fenrir Inc\Sleipnir\setting\client\user.ini 

    3.以下を追記して保存する 

    [WebKit] 
    AddStartupParams="/high-dpi-support=1 /force-device-scale-factor=1" 

    4.Sleipnirを起動する 

    私の環境でもこの手順を行うことで、よくわからないツールバーが消えました。
    最初はバージョンを下げようと思ったので、簡単に対処できて良かったです。

    ところで、Sleipnir はバージョン5以降からタブの使い勝手がすごく悪くなるのですけど、
    どうにかならないものですかね。
    このままですと、ずっとバージョン4系を使うことになりそうです。 

    rabbitcats at 23:42|PermalinkComments(0)TrackBack(0)雑記