FC2ブログ

Eee PC 4GにFreeBSD

EeePC 4Gに入れていたUbuntuも肥大してきて、容量的にUpdateも厳しくなってきたので、ここはさっくり消して、FreeBSD 9.1 Releaseへと。

ゲームもソースもportsも入れずにサクっとインストール。
pkg_addでxorgを入れて、xfce4を入れて。
これにfirefoxを入れて、scim-anthyを入れて、takao-fontを入れて。
とまぁここまでで、4GBぽっちのSSDの状況はというと、1.4GB程を使用。

商売上gcc48を入れないとC++11が使えないので、こいつもpkg_add。
空き容量が1.5GBと、まぁなんとかかんとかこんなもんか。

無線LANの設定がようわからんので、ifconfigコマンドを書いて毎回叩く。まぁこれでもたいして不満なし。
あとはタッチパッドのスクロールが使えないんだが、これもまぁ良し。
FreeBSDなのでFlashが見えないんだが、まぁ今時はスマホもあるし。
スマホがあれば別に音楽もいらないから入れない。
スマホがあるからSkypeも使わないしカメラも使わない。

んー、スマホでgccが使えればこのPCも要らんのだけれどなぁ・・・

とりあえずUbuntuでは得られなかったサクサク感で操作できてます。おしおし。これで少しはこのネトブクの寿命も伸びたかな?
スポンサーサイト

VS2012でのAfxInitRichEdit2()失敗

違う環境でどうなるのかは把握していないが、こんな現象が。

Visual Studio 2012をWindows7にインストール、MFCアプリケーションを単純にダイアログで作成してみる。
そのダイアログにツールボックスからRichEdit2.0を載せてみる。
で、コンパイル。は、何事もなく終了。で、実行すると、
ダイアログ作成に失敗して即座に終了してしまう。

調べて行くと、InitInstanceで呼ばれているRichEditの初期化関数、AfxInitRichEdit2()がfalseを返していることがわかる。
RichEditを使う際にはRICHED20.DLLをロードしなければならず、その処理をAfxInitRichEdit2()がやってくれるはずなのだが。
で、デバッガでMFCのソースの中まで追っかけてみると、Windows8とそれ以前の場合でLoadLibraryの処理が異なり、この環境ではOSがWindows7なのにも関わらずWindows8の処理へ流れている。
_WIN32_WINNTの定義がまずかったのかと思い、とりあえず
#define _WIN32_WINNT 0x501
とかしてみても結果は同じ。うーん、MFCをコンパイルしなおさなければならないのか??

とまぁ思案したんだが、面倒くさくなってしまって。
それじゃぁAfxInitRichEdit2内部でやるはずだったLoadLibraryを直接やっちまえ、ってことで、
InitInstanceにこう書いた。
if (!AfxInitRichEdit2()) {
const WCHAR *pszLibrary = L"RICHED20.DLL";
WCHAR wszLoadPath[MAX_PATH + 1];
if (::GetSystemDirectory(wszLoadPath, _countof(wszLoadPath)) != 0) {
if (wszLoadPath[wcslen(wszLoadPath) - 1] != L"\\") {
wcscat_s(wszLoadPath, _countof(wszLoadPath), L"\\");
}
wcscat_s(wszLoadPath, _countof(wszLoadPath), pszLibrary);
::LoadLibrary(wszLoadPath);
}
}


これでRichEdit2.0の載ったダイアログもきちんと表示されるようになりましたとさ。
エラー処理が無くってちょっとアレかなとも思うけれども、もともと戻り値を見ないでAfxInitRichEdit2()としていただけなんだから、大して困るわけでもないしな、と、気にしないことにして。

たぶん同じ理由で、VS2010から移行したRichEdit(2.0でないやつ)の場合も、AfxInitRichEdit()で失敗する。
その場合も、読み込むライブラリを"RICHED32.DLL"にすればいけるような気がする。

実行プログラムのパス(BSD)

実行プログラムのモジュール名で以前にもちょいと書いたが、今回はFreeBSDでの話。
前回、dlinfo使うんかなー、と書いたので、その例。

#include <iostream>
#include <unistd.h>
#include <link.h>
#include <dlfcn.h>
int main(void) {
Link_map *pmap;
dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &pmap);
std::cout << pmap->l_name << std::endl;
return 0;
}

んな感じで取れるような気がする。
プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク