あ゙ー。
生きてるのか死んでるのかわからーん。
このブログを検索
2009年12月6日
2009年12月5日
2009年12月2日
2009年12月1日
2009年11月22日
ひゃー
ネムぃのバージョンが1.050になったー。
スタートアップからの起動時にネムぃが実行できないバグを修正、
原因はタスクトレイへアイコン追加時に失敗したら例外を投げていたのが原因。
NeGuiでは停止フラグがONの状態でタスクトレイへのアイコン追加に失敗した場合、一定時間停止、再び追加処理、失敗時に一定時間停止…を一定数繰り返すのですがここで正常に追加できなかった場合例外を投げているわけです。
失敗する場合は「タイムアウト」と「タスクバーがまだ存在しない」場合。
本来この例外を止めなきゃいけなかったけどコーディング環境では「常に」タスクバーが生成済みだったのでこの問題が浮上しなかったわけです。
デバッグ時、意図的にExplorerを落として再びタスクバーが生成された場合にうまくアイコンが追加されていたのでここら辺の受け取り処理はうまくいってるもんだとばかり思ってたよ。
今回のバージョンアップの目玉はほとんどこれだけ。
でも機能的には大きな更新だったので1.050に。
後はまぁ、OS情報でエディションを取得+ソース整理。
エディション取得はMSDNライブラリに例があるので打ち込みが面倒なだけで特に問題なし。
問題はソース整理。
NeGuiの識別子や関数のインターフェイスがぐっちゃぐちゃ。
関数にいたってはポインタなのかrefなのか。
統一せねばなー。
スタートアップからの起動時にネムぃが実行できないバグを修正、
原因はタスクトレイへアイコン追加時に失敗したら例外を投げていたのが原因。
NeGuiでは停止フラグがONの状態でタスクトレイへのアイコン追加に失敗した場合、一定時間停止、再び追加処理、失敗時に一定時間停止…を一定数繰り返すのですがここで正常に追加できなかった場合例外を投げているわけです。
失敗する場合は「タイムアウト」と「タスクバーがまだ存在しない」場合。
本来この例外を止めなきゃいけなかったけどコーディング環境では「常に」タスクバーが生成済みだったのでこの問題が浮上しなかったわけです。
デバッグ時、意図的にExplorerを落として再びタスクバーが生成された場合にうまくアイコンが追加されていたのでここら辺の受け取り処理はうまくいってるもんだとばかり思ってたよ。
今回のバージョンアップの目玉はほとんどこれだけ。
でも機能的には大きな更新だったので1.050に。
後はまぁ、OS情報でエディションを取得+ソース整理。
エディション取得はMSDNライブラリに例があるので打ち込みが面倒なだけで特に問題なし。
問題はソース整理。
NeGuiの識別子や関数のインターフェイスがぐっちゃぐちゃ。
関数にいたってはポインタなのかrefなのか。
統一せねばなー。
2009年11月21日
2009年11月16日
2009年11月15日
パンがなければコーラでも飲んどけばいいじゃないか
今日更新した1.021はそんなに重要なアップデートでもないのでパッケージ配布なし。
そろそろネムぃの更新飽きてきたぞー。
とりあえず飽きを忘れるためにVectorライブラリサービスへ登録、掲示板レンタルしたりカウンター設置したり。
そんなこんなしてもやっぱりやる気でない。
NeGuiでもいじろうかなー。
ぬあー。
そろそろネムぃの更新飽きてきたぞー。
とりあえず飽きを忘れるためにVectorライブラリサービスへ登録、掲示板レンタルしたりカウンター設置したり。
そんなこんなしてもやっぱりやる気でない。
NeGuiでもいじろうかなー。
ぬあー。
2009年11月9日
マシュマロってあんましおいしくないと思った
立て続けにネムぃのバージョンアップ。
1.010にアイテムのメモが保持されないバグがあったので1.020もパッケージにて公開。
最近はネムぃの機能からNeGuiに引越しできそうなmoduleを引越し中。
正直GUI以外のmoduleはあんまし移動させたくなかったんですけど今後NeGuiを使用して別ソフトを作る可能性も考えたらpackageまとめておいたほうがいいかと考え決行。
とはいってもNeGuiはネムぃがつくれりゃそれでいいライブラリという位置づけなんで本当に快適に使用できるかは不明なまま一応検証用としてtest.dを作って実行してみた結果がこの画像。
とまぁこんなかんじ。所要時間は10分くらい。
一応ほかのソフトも作れなくもないかなーと思う今日この頃。
下記がそのソース↓
1.010にアイテムのメモが保持されないバグがあったので1.020もパッケージにて公開。
最近はネムぃの機能からNeGuiに引越しできそうなmoduleを引越し中。
正直GUI以外のmoduleはあんまし移動させたくなかったんですけど今後NeGuiを使用して別ソフトを作る可能性も考えたらpackageまとめておいたほうがいいかと考え決行。
とはいってもNeGuiはネムぃがつくれりゃそれでいいライブラリという位置づけなんで本当に快適に使用できるかは不明なまま一応検証用としてtest.dを作って実行してみた結果がこの画像。
とまぁこんなかんじ。所要時間は10分くらい。
一応ほかのソフトも作れなくもないかなーと思う今日この頃。
下記がそのソース↓
/** */ module nemuxi.negui.test; import nemuxi.negui.allimport; version(build) { pragma(build_def, "EXETYPE NT"); pragma(build_def, "SUBSYSTEM WINDOWS,5.0"); } void main() { auto aaa=new TestNeGui; aaa.execute; } class TestNeGui: MainWindow { enum CTRL: ITEM_ID { HELLO=1, EDIT, MSGBOX } private { TextLabel label; MultiEdit edit; Push button; Font CtrlFont, EditFont; } this() { GUIINFO g; super(&g); } protected override { void OnCreate() { // メインウィンドウ処理 ------------------------------- // タイトルバーあり caption = true; // システムメニューあり systemMenu = true; // サイズ変更用境界線あり frameSize = true; // 表示状態 setShow(SHOW.SHOWNORMAL); // 位置とサイズの設定 move(0, 0, 200, 200); // メインウィンドウを親としてラベル作成 --------------- label = new TextLabel(this, CTRL.HELLO); // 水平位置設定 label.horizonAlign = HORIZON_ALIGN.CENTER; // 縦位置 label.verticalCenter = true; // 文字設定 label.text = Text("はろー わーるど"); // メインウィンドウを親としてエディットボックス作成 --- edit = new MultiEdit(this, CTRL.EDIT); // 空白にしておく edit.text = Text.emptyText; // メインウィンドウを親としてボタン作成 --------------- button = new Push(this, CTRL.MSGBOX); // 文字設定 button.text = Text("メッセージ表示"); // フォント生成 --------------------------------------- CtrlFont = new Font(Font.STOCK.MESSAGE); EditFont = new Font(Font.STOCK.SYSTEM); EditFont.pitchAndFamily(Font.PITCH_FAMILY.MODERN); // 一括してフォントの設定 ----------------------------- auto ctrls = new ControlGroup(label, edit, button); ctrls.font = CtrlFont; // エディットボックスは等幅 edit.font = EditFont; // パネルの設定 --------------------------------------- auto panel = new Line(DIRECTION.VERTICAL); // ラベルの設定、 あまりの領域 panel += label; panel.sizeInfo(0).absolute = -1; // エディットボックスの設定、50% panel += edit; panel.sizeInfo(1).percent = 50; // ボタンの設定、最低限の高さ panel += button; panel.sizeInfo(2).absolute = button.minContentHeight; // それぞれをウィンドウのパネルに設定 layoutManager.basePanel = panel; } bool OnCommand(ITEM_ID Id, MESSAGETYPE MessageType, NeGui Sender) { if(Sender is button) { if(MessageType == Button.EVENT.CLICKED) { // メッセージボックス表示 ShowMessage(); return true; } } return false; } } private void ShowMessage() { // エディットボックスの文字列取得 auto EditText = edit.text; // エディットボックスの改行数取得 auto LineCount = edit.lineCount-1; // 取得文字列から文字列長取得 auto TextLength = edit.textLength; // ダイアログ生成 auto dialog = new MessageDialog(); // 表示メッセージを書式付で dialog.message = Text( "文字列%s%s%s", Text.newline, EditText, Text.newline, "%s%s\n", Text.repeat(Text('-'), 40), Text.newline, "改行数 = %s\n", LineCount, "文字数 = %s\n", TextLength ); // タイトルバーを日時に auto time = new DateTime(); time.format = "[YY]/[M]/[D], [hh]:[mm]:[ss]"; dialog.text = Text(time); // 表示アイコン dialog.icon = MessageDialog.ICON.INFORMATION; // ボタンの種類 dialog.button = MessageDialog.BUTTON.OK; // 表示 dialog.show; } }一応全部で140行くらいでした。
2009年11月3日
2009年10月27日
2009年10月7日
2009年10月5日
2009年10月3日
2009年9月27日
2009年9月25日
2009年9月23日
2009年9月21日
うちのCentOSがkernel panicで死んだ
β17だー。
コマンド型の暫定的な実装が主な更新。
DLLも更新したので今回もパッケージ配布で準備が面倒、そろそろ一括バッチでも作ろうか。
今回実装したコマンド型は入力された文字列を正規表現として扱うのでちょっと使いづらいかも知れないので将来的は通常検索・ワイルドカード・正規表現を切り替えられるようにしたい。
Migemoはあまり心惹かれないので実装する気なし。
次バージョンはUIの強化(整理)なんでパネル辺りを重点的にやるかー…。
そのまえにファイルサーバー直さないと…めんど。
コマンド型の暫定的な実装が主な更新。
DLLも更新したので今回もパッケージ配布で準備が面倒、そろそろ一括バッチでも作ろうか。
今回実装したコマンド型は入力された文字列を正規表現として扱うのでちょっと使いづらいかも知れないので将来的は通常検索・ワイルドカード・正規表現を切り替えられるようにしたい。
Migemoはあまり心惹かれないので実装する気なし。
次バージョンはUIの強化(整理)なんでパネル辺りを重点的にやるかー…。
そのまえにファイルサーバー直さないと…めんど。
2009年9月18日
2009年9月17日
マウスフックがバグってたー
謎が多すぎる。
コマンド型を実装してからマウスフックでネムぃがサヨナラする事象が発生中。
コマンド型で入力補完的なコンボボックスのリスト部分的なものを表示させてからマウスフックを使用すると
Hooker.dllを使用していなければ大丈夫。
非常に意味が分からない。
DDBGで動きを見る感じでは
コマンド型を実装してからマウスフックでネムぃがサヨナラする事象が発生中。
コマンド型で入力補完的なコンボボックスのリスト部分的なものを表示させてからマウスフックを使用すると
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at HOOKER.DLL (0x012b8127) thread(6100)が発生。
Hooker.dllを使用していなければ大丈夫。
非常に意味が分からない。
DDBGで動きを見る感じでは
- ネムぃ起動
- 起動の最後にHooker.dllがロードされる
No symbols available from HOOKER.DLL HOOKER.DLL loaded at 0x012b0000
- コマンド入力ウィンドウを表示
- 何か入力するとリストが表示され以下がロードされる
No symbols available from IMJPSQM.dll IMJPSQM.dll loaded at 0x3ac70000 No symbols available from IMJPCD.DIC IMJPCD.DIC loaded at 0x3ae00000
- ここで分岐。
- ①このままリストからアイテムを選択して実行すると以下がロードされて何事も無く動く。
No symbols available from NETAPI32.dll NETAPI32.dll loaded at 0x59250000 No symbols available from urlmon.dll urlmon.dll loaded at 0x442a0000 No symbols available from iertutil.dll iertutil.dll loaded at 0x40930000
②リストを無視してデスクトップでホイールクリックすると
EXCEPTION_ACCESS_VIOLATION
2009年9月16日
いやいやいやいや
Access Violationが発生中。
場所がわかんねー。
DDBG使ってもわけわからん。
せめて変数名だけでも分からないもんだろうか。
場所がわかんねー。
DDBG使ってもわけわからん。
Unhandled D Exception (std.contracts.ErrnoException "C:\dmd\dmd\src\phobos\std\stdio.d(896): (Bad file descriptor)") at KERNEL32.dll (0x7c812afb) thread(2632) ->;us #1 0x004bd728 in __d_throw@4 () from deh #2 0x004bd538 in extern (C) int rt.dmain2.main(int, char**) . void runMain(void*) () from dmain2 #3 0x004bd575 in extern (C) int rt.dmain2.main(int, char**) . void runAll(void*) () from dmain2 #4 0x004bd2e8 in _main () from dmain2 #5 0x00521695 in _mainCRTStartup () from constart #6 0x7c817077 in ?? () from KERNEL32.dll #0 Access Violation
せめて変数名だけでも分からないもんだろうか。
2009年9月14日
2009年9月13日
こないだネットワーク難民になった
はてさてβ17に向けてコマンド型ランチャを考え中。
現状の なんとも言い難い実装を使うべきか新たに書き直すべきか。
コマンド型っていうと一行分の入力欄にコマンドを入力して登録ファイル等々を実行するのが普通なんでそれを踏襲すべきか、それとも違った実装で行くか。
どっちかって言うと後者を採用してCUIちっくな実装にしたいんだけど中々決まらない。
とりあえずコード書くのが鬱陶しいなぁ。
現状の なんとも言い難い実装を使うべきか新たに書き直すべきか。
コマンド型っていうと一行分の入力欄にコマンドを入力して登録ファイル等々を実行するのが普通なんでそれを踏襲すべきか、それとも違った実装で行くか。
どっちかって言うと後者を採用してCUIちっくな実装にしたいんだけど中々決まらない。
とりあえずコード書くのが鬱陶しいなぁ。
2009年9月12日
2009年9月9日
電波時計の電池が意外と長持ちでびっくり
ネムぃがバージョンアップした感じです。
ソースがあまりにも汚くなったので次バージョンは機能の追加はせずに整理に重点を置きたいなぁ。
今回の主な変更点はアイテム選択時のコンボボックスやリストボックスに対象アイテムのアイコンを描画するようにしたこと。
今まではアイコン読み込みに掛かる時間等を考えるとあんましやりたくなかったのですが適当にファイルを30個くらい読ませてみたら意外と速く処理できたのでじゃあ実装してみよう、といった感じで進んでいきました。
まぁそのおかげでソースが凄く凄く読み難くなってしまいましたが、、、てか、あれだ、書いてて気付いたけどイメージリストのkill忘れてるわ今回。
他にも色々やったけどアイコン描画がいろんなところに影響しすぎて修正しまくってその過程でなにやったか忘れた。
ソースがあまりにも汚くなったので次バージョンは機能の追加はせずに整理に重点を置きたいなぁ。
今回の主な変更点はアイテム選択時のコンボボックスやリストボックスに対象アイテムのアイコンを描画するようにしたこと。
今まではアイコン読み込みに掛かる時間等を考えるとあんましやりたくなかったのですが適当にファイルを30個くらい読ませてみたら意外と速く処理できたのでじゃあ実装してみよう、といった感じで進んでいきました。
まぁそのおかげでソースが凄く凄く読み難くなってしまいましたが、、、てか、あれだ、書いてて気付いたけどイメージリストのkill忘れてるわ今回。
他にも色々やったけどアイコン描画がいろんなところに影響しすぎて修正しまくってその過程でなにやったか忘れた。
2009年9月6日
最近コーラがやたらうまい
DMD2.032のtoで泣いたけどD言語 Part22の839氏も死んでたっぽい。
修正パッチへのリンクもあったのでそれを参考にtoで泣かなくてよくなりました。
ネムぃの設定画面で多用しているアイテム一覧のコントロールをそろそろ綺麗にしようと思いコンボボックス→拡張コンボボックスに変更しようと思いましてコード実装してみたらすごく変。
STANDARDなら大丈夫なんですけどDROPDOWNとかを指定すると途端に動かない。
いや、動いてんだけどリスト部分が表示されない。
あっれ~ってなりながらGoogle大冒険した結果MSDNのUsing ComboBoxEx Controlsにあんましよろしくない文が。
英語わかんないなりに訳してみるとイメージリスト設定後にリサイズできないの?
とりあえずよく分からんけど適当に実装してみた。
以上、同じ問題で誰かが悩まないようにメモ書きです。
←実装した結果。
修正パッチへのリンクもあったのでそれを参考にtoで泣かなくてよくなりました。
ネムぃの設定画面で多用しているアイテム一覧のコントロールをそろそろ綺麗にしようと思いコンボボックス→拡張コンボボックスに変更しようと思いましてコード実装してみたらすごく変。
STANDARDなら大丈夫なんですけどDROPDOWNとかを指定すると途端に動かない。
いや、動いてんだけどリスト部分が表示されない。
あっれ~ってなりながらGoogle大冒険した結果MSDNのUsing ComboBoxEx Controlsにあんましよろしくない文が。
hwnd = CreateWindowEx(0, WC_COMBOBOXEX, NULL,
WS_BORDER | WS_VISIBLE |
WS_CHILD | CBS_DROPDOWN,
// No size yet--resize after setting image list.
0, // Vertical position of Combobox
0, // Horizontal position of Combobox
0, // Sets the width of Combobox
100, // Sets the height of Combobox
g_hwndMain,
NULL,
g_hinst,
NULL);
英語わかんないなりに訳してみるとイメージリスト設定後にリサイズできないの?
とりあえずよく分からんけど適当に実装してみた。
以上、同じ問題で誰かが悩まないようにメモ書きです。
←実装した結果。
2009年9月1日
今日は仕事がお休みだー。
あー、β14公開です。
内部的にはstringからネムぃで使用しているTextって型に移行中。
カレキとの兼ね合いでstring使っているところもどうせ外向けにはTextに変換してるんだし最初からTextでいいじゃないかという思惑で作業中。
ある程度変換作業が進み動くようにはなったので公開した感じです。
今回から更新記録をBloggerに移行です。
公開って言っても今回バイナリ配布じゃないしそこまで公開しなきゃいけないってもんでもありませんでしたから。
機能的な変更は環境変数の動作が不完全だったバグを修正したくらい。内部的にはstringからネムぃで使用しているTextって型に移行中。
カレキとの兼ね合いでstring使っているところもどうせ外向けにはTextに変換してるんだし最初からTextでいいじゃないかという思惑で作業中。
ある程度変換作業が進み動くようにはなったので公開した感じです。
今回から更新記録をBloggerに移行です。
2009年8月30日
2009年8月28日
だ、だ、だ、だ
β13アップデート。
今回の主なバージョンアップはD&D時のショートカットファイル対応です。
ファイルがD&Dされたときの動作やコードはまだまだ未完成ですがCOMを実装したということでのお披露目みたいなもんです。
というかCOMの実装にえらく手間取りました。
どうもBindings for the Windows APIのIShellLinkが変でIUnknownのメソッドまで定義されてたのが原因だったようですが、これに気付くのに4-5時間ほど掛かりました。
まさかwin32.*に問題があるとは思いもしなかったよ。
んでCOMに関してはwin32.*を使用するの怖いなーと思ってたらwin32.uuidがなんか変。
とりあえず
これで対応。
あとはnemuxi.com.*に自前で必要な分だけ定義してます。
今回の主なバージョンアップはD&D時のショートカットファイル対応です。
ファイルがD&Dされたときの動作やコードはまだまだ未完成ですがCOMを実装したということでのお披露目みたいなもんです。
というかCOMの実装にえらく手間取りました。
どうもBindings for the Windows APIのIShellLinkが変でIUnknownのメソッドまで定義されてたのが原因だったようですが、これに気付くのに4-5時間ほど掛かりました。
まさかwin32.*に問題があるとは思いもしなかったよ。
んでCOMに関してはwin32.*を使用するの怖いなーと思ってたらwin32.uuidがなんか変。
とりあえず
module win32.uuid; import win32.basetyps; extern(C) { const IID GUID_NULL = {0x00000000, 0x0000, 0x0000, [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]}; } version(none) export extern(C) { const IID _DBBMKGUID = {0xF6304BB0, 0xD188, 0x11CD, [0xAD, 0x48, 0x00, 0xAA, 0x00, 0x3C, 0x9C, 0xB6]}; ... const IID TID_DXFILEHeader = {0x3D82AB43, 0x62DA, 0x11CF, [0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33]}; }
これで対応。
あとはnemuxi.com.*に自前で必要な分だけ定義してます。
2009年8月27日
2009年8月25日
急に涼しくなったけど温暖化はどこに行ったんだろう
昨日くらいにネムぃのバージョンβ11を出して一安心の今日この頃。
バージョンアップしたその瞬間からβ12への修正へ進むんですが修正なりなんなりすることが分かってるんだから公開しなきゃいいのに、と考えてしまう自分もいるわけです。
β版も早めに卒業したいので最高でβ20(16進だけど)までを限度と考えてます。
β12に向けて実装しようと考えている部分は下記の通り。
ドキュメントやらサイトの整備やら色々修正せねばならんことが多くなってきたのでゆっくり一つずつやっていきたいです。
…たぶん無理だけど。
バージョンアップしたその瞬間からβ12への修正へ進むんですが修正なりなんなりすることが分かってるんだから公開しなきゃいいのに、と考えてしまう自分もいるわけです。
β版も早めに卒業したいので最高でβ20(16進だけど)までを限度と考えてます。
β12に向けて実装しようと考えている部分は下記の通り。
- メインウィンドウの細かな制限
- アイテム設定の作業簡略化/未実装部分の実装
- グローバルな設定をローカルへ
ドキュメントやらサイトの整備やら色々修正せねばならんことが多くなってきたのでゆっくり一つずつやっていきたいです。
…たぶん無理だけど。
2009年8月19日
2009年8月17日
ヘルプファイルってやっぱりだるいー
いざ作ろうと思ったヘルプファイル。
やはりというか、だるい。
何がだるいって使い方を知っているモノの使い方を記述するのがすげーだるい。
サーバーにヘルプページ作っておくのが一番楽そうではあるのですがいかんせんヲコノのサーバーは借り物なんで無茶は出来ない。
CHMが一番いいかもしれませんが、なんだろう、Help WorkShop落とすのだるい。
こんなことを考えててふと頭に浮かんだのがHTA。
うん、選択としては最悪なんだけど面白そう。
2-3日遊んでみて作れそうならHTAで作ってみます。
やはりというか、だるい。
何がだるいって使い方を知っているモノの使い方を記述するのがすげーだるい。
- プレーンテキスト
- Winヘルプ
- CHMヘルプ
- HTMLヘルプ
- Web上のオンラインヘルプ
サーバーにヘルプページ作っておくのが一番楽そうではあるのですがいかんせんヲコノのサーバーは借り物なんで無茶は出来ない。
CHMが一番いいかもしれませんが、なんだろう、Help WorkShop落とすのだるい。
こんなことを考えててふと頭に浮かんだのがHTA。
うん、選択としては最悪なんだけど面白そう。
2-3日遊んでみて作れそうならHTAで作ってみます。
2009年8月13日
2009年8月11日
2009年8月3日
2009年8月2日
マウスフックでバグったー
---------------------------
توكوغاوا إيئه-ياسو: nemuxi.exe - アプリケーション エラー
---------------------------
"0xe4cbbdff" の命令が "0xe4cbbdff" のメモリを参照しました。メモリが "read" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
---------------------------
OK
---------------------------
توكوغاوا إيئه-ياسو: nemuxi.exe - アプリケーション エラー
---------------------------
"0xe4cbbdff" の命令が "0xe4cbbdff" のメモリを参照しました。メモリが "read" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
---------------------------
OK
---------------------------
2009年8月1日
2009年7月23日
2009年7月1日
エラーが長い。
パネルが一応完成しました。
実装したのは三個。
構想上はGrid(Table?)パネルが欲しかったのですがTansu/Lineの中にパネル放り込めば代替手段になることに気付いたので未実装です。
あと.Netなんかだとパネルが一つのコントロール(ウィンドウ? .Netの詳しいことは知らん)として扱っているみたいですがNeGuiではレイアウトマネージャに付随するサイズ変更情報として扱っています。
レイアウトマネージャもベースパネルへの連絡役です。
適当にWS_CHILDつけてコントロールでも作ってれば素直に作ることが出来たかもしれないんですがグループボックス作ってそこにコントロール乗せた時にメッセージループの取捨選択とか結構泣けたのでもうあんな思いしたくねーなーと考えた結果、コントロール作らずに回り道しています。
あとネムぃの実装じゃなしにT* -> ref T, const T* -> ref const(T)とかやってます。
こういうのするから進まないんだなぁ。
↓エラー↓
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at nemuxi.gui.nemuxi.window.nemuxiwindow.buttonlauncher.ButtonListMenu.show.nemuxi.gui.nemuxi.window.nemuxiwindow.nemuxiwindow.NemuxiWindow.nemuxi.gui.control.control.Control.nemuxi.file.items.item.Item gui\nemuxi\window\nemuxiwindow\buttonlauncher.d:319 (0x0045b5e0) thread(1208)
実装したのは三個。
- Tansu
タンス型のパネル。
各セルの大きさが同一。 - Line
直線状に伸びていくパネル。
セル毎に大きさを保持。最終セルの大きさはLineに処理させることが可能。 - Dual
セルが二つのみのパネル。
Lineを機能限定した感じ。
構想上はGrid(Table?)パネルが欲しかったのですがTansu/Lineの中にパネル放り込めば代替手段になることに気付いたので未実装です。
あと.Netなんかだとパネルが一つのコントロール(ウィンドウ? .Netの詳しいことは知らん)として扱っているみたいですがNeGuiではレイアウトマネージャに付随するサイズ変更情報として扱っています。
レイアウトマネージャもベースパネルへの連絡役です。
適当にWS_CHILDつけてコントロールでも作ってれば素直に作ることが出来たかもしれないんですがグループボックス作ってそこにコントロール乗せた時にメッセージループの取捨選択とか結構泣けたのでもうあんな思いしたくねーなーと考えた結果、コントロール作らずに回り道しています。
あとネムぃの実装じゃなしにT* -> ref T, const T* -> ref const(T)とかやってます。
こういうのするから進まないんだなぁ。
↓エラー↓
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at nemuxi.gui.nemuxi.window.nemuxiwindow.buttonlauncher.ButtonListMenu.show.nemuxi.gui.nemuxi.window.nemuxiwindow.nemuxiwindow.NemuxiWindow.nemuxi.gui.control.control.Control.nemuxi.file.items.item.Item gui\nemuxi\window\nemuxiwindow\buttonlauncher.d:319 (0x0045b5e0) thread(1208)
2009年6月27日
サーバーが熱い
人は皆、過ちを犯すものなのです。
それに事前に気付いて対処するか、すぐ気付くか、後になって気付くか、一生気付かないか。
「設定プログラムを作るぞー」までは進んだんですがコントロールを増やしていくとWS_SIZE来たときに悲惨極まりない。
グループボックス作ろうが何しようが最終的にはMoveWindowの嵐で頭狂いそうになります。
NeGuiでは一応簡略化してるんですがそれでも頭が頭痛で痛い。
そんな状態なんで俗に言うパネルっぽいのを実装することにしました。
構成図としては、
こんなもんでいくつもり。
なんか最近機能を追加するたびに肥大化していくなぁ。
実際使わねーだろーなぁ。
それに事前に気付いて対処するか、すぐ気付くか、後になって気付くか、一生気付かないか。
「設定プログラムを作るぞー」までは進んだんですがコントロールを増やしていくとWS_SIZE来たときに悲惨極まりない。
グループボックス作ろうが何しようが最終的にはMoveWindowの嵐で頭狂いそうになります。
NeGuiでは一応簡略化してるんですがそれでも頭が頭痛で痛い。
そんな状態なんで俗に言うパネルっぽいのを実装することにしました。
構成図としては、
- Layout(abstract)
- LayoutManager(final)
- Panel(abstract)
- XXXPanel
- YYYPanel
こんなもんでいくつもり。
なんか最近機能を追加するたびに肥大化していくなぁ。
実際使わねーだろーなぁ。
2009年6月21日
2009年6月2日
2009年6月1日
2009年5月23日
業務スーパーでカップうどん買った
そろそろ設定プログラム実装する。
いい加減引き伸ばす口実もなくなってきたしほかにやることないし。
実装しなきゃいけないリスト↓
とりあえず設定プログラムを実装してからそれ以外の項目を消化してきます。
いい加減引き伸ばす口実もなくなってきたしほかにやることないし。
実装しなきゃいけないリスト↓
- 設定プログラム
- コマンド型ランチャ
- ログ(機能は出来てるのでどこで取るかが問題なだけ)
- 本体へのD&Dによる処理(登録するかファイルの起動か)
- アイテムの循環参照問題
- マウスフック
- 外部ツールとの連携インターフェイス(char[]での標準出力はもう取れてるから何と連携するか)
- 外部文字列リソース(優先度最低)
とりあえず設定プログラムを実装してからそれ以外の項目を消化してきます。
2009年5月20日
2009年5月19日
2009年5月18日
テスト前に掃除したくなる現象発病中

左上から順に
- アップダウンコントロール
- ホットキーコントロール
- DTPコントロール(日付)
- DTPコントロール(時間)
作っていて思うんですがスタイルの付け替えで反映される・されないの資料ってMSDNの原文しか無いんでしょうか。
俺英語読めないし。
メモ帳だと右端で折り返すを選択するとコントロールそのものを作り直すらしいのですが現時点でのNeGuiだとフォントとかその辺のGDIオブジェクトの世話してられないんで未実装です。
以下チラシの裏
/**
テスト専用ダイアログ。
*/
module nemuxi.test.debugdialog;
debug import std.stdio: wl = writefln, pl = printf;
debug(debugdialog) void main() {}
import win32.windows;
import nemuxi.base;
import nemuxi.draw.image.font;
import nemuxi.gui.gui;
import nemuxi.gui.window.dialog.dialog;
import nemuxi.gui.control.control;
import nemuxi.gui.control.editbox.editbox;
import nemuxi.gui.control.updown.updown;
import nemuxi.gui.control.hotkey.hotkey;
import nemuxi.gui.control.time.datetimepick;
debug{} else {static assert(false, "debug only!");}
class DebugDialog: ModalDialog {
enum CTRL: ITEM_ID {
INPUT=1,
UD,
HOT,
DTP1,
DTP2,
}
Font font;
ControlGroup group;
EditBox Input;
UpDown spin;
HotKey hot;
DateTimePick[2] dtp;
this(NeWindow Owner) {
GUIINFO GuiInfo;
GuiInfo.Owner = Owner;
GuiInfo.Style = WS_DLGFRAME | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU;
super(&GuiInfo);
posSize(300,300);
}
protected override {
void OnCreate() {
font=GetSystemFont(SYSFONT.MESSAGE);
Input = new EditBox(this, CTRL.INPUT);
Input.move(0,0,100,30);
spin =new UpDown(this, CTRL.UD, UpDown.POSITION.RIGHT);
//spin.move(101,101,100,100);
spin.buddy = Input;
spin.range(-1000,1000);
spin.value=159;
spin.reLoad;
HOTKEYVALUE hk;
hk.modToHotkey(MOD.SHIFT);
hk.Key = KEY.D;
hot = new HotKey(this, CTRL.HOT);
hot.textAlign=TEXTALIGN.CENTER;
hot.move(100,0,200,30);
hot.rule(HotKey.RULE.NONE, HOTKEY.EXT);
hot.value
=hk;
dtp[0] = new DatePick(this, CTRL.DTP1);
dtp[0].move(0, 40, 200, 30);
dtp[1] = new TimePick(this, CTRL.DTP2);
dtp[1].move(0, 80, 200, 30);
dtp[1].value=new DateTime(
1999, 12, 31, 0,
23, 59, 59, 999
);
group = new ControlGroup(
Input, spin, hot, dtp[0], dtp[1]
);
group.font = font;
}
}
}
2009年5月9日
2009年5月3日
2009年4月29日
2009年4月26日
2009年4月23日
IEはね、戦歴の猛者なんだよ
2009年4月22日
2009年4月21日
D 2.029
だめだ、いつもバージョンアップには諦観を込めて作業してるんだけど今回のはきついかもしんない。
C:\dmd\dmd\src\phobos\std\traits.d(1011): Error: static assert "Type const(int) does not have an Unsigned counterpart"
C:\dmd\dmd\src\phobos\std\traits.d(2454): Error: template instance std.traits.Unsigned!(const(int)) error instantiating
C:\dmd\dmd\src\phobos\std\conv.d(2454): Error: Unsigned!(const(int)) is used as a type
どっから呼び出してんのかわっかんねー
C:\dmd\dmd\src\phobos\std\traits.d(1011): Error: static assert "Type const(int) does not have an Unsigned counterpart"
C:\dmd\dmd\src\phobos\std\traits.d(2454): Error: template instance std.traits.Unsigned!(const(int)) error instantiating
C:\dmd\dmd\src\phobos\std\conv.d(2454): Error: Unsigned!(const(int)) is used as a type
どっから呼び出してんのかわっかんねー
2009年4月17日
2009年4月13日
2009年4月8日
抹茶うめぇ
そろそろネムぃの基本実装が終わります。
設定ファイルの反映が終わったので個人的に使用するには問題ないかと。
未実装としては
自分で作ってるんだから設定ファイルの記述方法は理解してますし記述してます。
そんな事情もあり最後まで引っ張ろうと考えてここまで来たのですがもはややる気が出ない。
RAD無しで設定部分を作るのは変体の極みなんじゃないだろうか(RLもそうだったけどさ)。
さらに設定ファイルを下手に独自形式にしたのがまずかったかもしれないです。
XMLでやっときゃ適当に誤魔化せたかもしれないなぁ。
設定ファイルの反映が終わったので個人的に使用するには問題ないかと。
未実装としては
- コマンド型のリスト表示(コンボボックスを使用していましたが操作感が気に食わないので再実装中)
- アイテムの循環参照問題
- マウスフック(DLLめんどい)
- 外部ツールとの連携インターフェイス
- 外部文字列リソース
- エラー用内部画像リソース(もしくは対処方法)
- 設定画面
自分で作ってるんだから設定ファイルの記述方法は理解してますし記述してます。
そんな事情もあり最後まで引っ張ろうと考えてここまで来たのですがもはややる気が出ない。
RAD無しで設定部分を作るのは変体の極みなんじゃないだろうか(RLもそうだったけどさ)。
さらに設定ファイルを下手に独自形式にしたのがまずかったかもしれないです。
XMLでやっときゃ適当に誤魔化せたかもしれないなぁ。
2009年4月5日
2009年4月1日
2009年3月31日
2009年3月29日
2009年3月21日
2009年3月20日
2009年3月8日
2009年3月4日
計画することは大事なんだね
内部設計がグチャグチャになってきたぞー!
ウィンドウ関連の関数を作る場合にはHWNDを引数に作っていたのですがこれだとHWNDとHDCの区別がまったく出来ないのでGuiクラスやCanvasクラスなんぞを構築したのです。
この設計から(時の流れとうっかりで)外れた関数、サブクラス化とかそういったのがHWNDを受け取るようになっていて素晴らしい混乱ぶり。
なんだかもう弄れば弄るほど、修正すれば修正するほど阿鼻叫喚な状態になってきた。
てかもうNeGuiの出来損ないみたいなクラス郡が。。。
ウィンドウ関連の関数を作る場合にはHWNDを引数に作っていたのですがこれだとHWNDとHDCの区別がまったく出来ないのでGuiクラスやCanvasクラスなんぞを構築したのです。
この設計から(時の流れとうっかりで)外れた関数、サブクラス化とかそういったのがHWNDを受け取るようになっていて素晴らしい混乱ぶり。
なんだかもう弄れば弄るほど、修正すれば修正するほど阿鼻叫喚な状態になってきた。
てかもうNeGuiの出来損ないみたいなクラス郡が。。。
2009年3月2日
2009年2月28日
2009年2月24日
2009年2月18日
2009年2月15日
2009年2月13日
めもめも
忘れないうちに引っ掛かった部分をメモ。
extern(Windows)が無いと怒涛のごとく落ちる。
extern(Windows) int BrowseCallbackProc(
HWND hWnd,
UINT Message,
LPARAM lParam,
LPARAM lpData
)
//------------------------------------------------
typedef extern(Windows) BOOL function(
HWND,
LPWSTR,
DWORD,
DWORD*
) SHChangeIconDialogType;
SHChangeIconDialogType SHChangeIconDialog;
extern(Windows)が無いと怒涛のごとく落ちる。
2009年2月10日
ランチャーの基盤部分
表題通りですがランチャーの基盤、そして一番重要なこと。
とりあえず何かしらを実行する
コレに尽きると思います。
ネムぃでは実行するデータをアイテムと呼び、それをファイルに記述しておきます。
内容はアドレスや引数などの実行するのに必要な情報(他にも色々)です。
このアイテム、今のところ四個に区別されます。
URIアイテムはファイルの有無を判定できないけど何かを起動できる。
問題はマルチとリンク。
マルチは複数のアイテムを起動できる(現時点では順々に)アイテム。
リンクは他のアイテムへのショートカットみたいなアイテム。
マルチアイテムは複数のアイテムをバッチ処理よろしく起動することが可能なので特定の環境(A起動させるにはBが必要だからBとAを起動させる)を構築するのに有効かと。
リンクアイテムはリンク先アイテムに情報の上書き(普段はCの作業フォルダはC:\だけどD:\にしたい、その他はそのままで)して使用。
これだけだと意外と使えんじゃね?と思うのですが問題は「循環」。
リンク先アイテムがリンクアイテムだったりマルチアイテムの起動アイテムが同じマルチアイテムだったり、といった状況にどう対処するかが今後の課題です。
制限付きという事でリンク先はリンク以外、マルチアイテム内アイテムは通常・URIアイテムのみといった制限は簡単なんですがいまいち効果を発揮しにくいんじゃないかなぁと思うわけです。
リンク先がマルチアイテムでその中にマルチアイテムやリンクアイテムを呼べる仕様も結構良いんじゃないかと思うわけです。
妙案があれば良いなぁ。
とりあえず何かしらを実行する
コレに尽きると思います。
ネムぃでは実行するデータをアイテムと呼び、それをファイルに記述しておきます。
内容はアドレスや引数などの実行するのに必要な情報(他にも色々)です。
このアイテム、今のところ四個に区別されます。
- 通常アイテム
- URIアイテム
- マルチアイテム
- リンクアイテム
URIアイテムはファイルの有無を判定できないけど何かを起動できる。
問題はマルチとリンク。
マルチは複数のアイテムを起動できる(現時点では順々に)アイテム。
リンクは他のアイテムへのショートカットみたいなアイテム。
マルチアイテムは複数のアイテムをバッチ処理よろしく起動することが可能なので特定の環境(A起動させるにはBが必要だからBとAを起動させる)を構築するのに有効かと。
リンクアイテムはリンク先アイテムに情報の上書き(普段はCの作業フォルダはC:\だけどD:\にしたい、その他はそのままで)して使用。
これだけだと意外と使えんじゃね?と思うのですが問題は「循環」。
リンク先アイテムがリンクアイテムだったりマルチアイテムの起動アイテムが同じマルチアイテムだったり、といった状況にどう対処するかが今後の課題です。
制限付きという事でリンク先はリンク以外、マルチアイテム内アイテムは通常・URIアイテムのみといった制限は簡単なんですがいまいち効果を発揮しにくいんじゃないかなぁと思うわけです。
リンク先がマルチアイテムでその中にマルチアイテムやリンクアイテムを呼べる仕様も結構良いんじゃないかと思うわけです。
妙案があれば良いなぁ。
2009年2月9日
2009年2月7日
ウィンドウとモーダル/モードレスダイアログボックス
敢えて通らずに、ワザと無視して、見たくないものには蓋をして。
でもいつかは作らなくちゃならない、そんなものだと認識しているもの。
ダイアログボックスめんどい。
巷にあふれるダイアログボックス作成方法ではマクロがどうとかリソースがどうとか。
そんなに素敵な環境じゃねーんだよ。
CreateDialogだって中身はCreateWindowEx だしCreateToolbarとなんら変わりない。
ResEdit使って作るのもいいんですが何かと不安多し、Dに。
モーダルダイアログは簡単に実装できるんですがモードレスがめんどい。
モードレス単品で作るにはMSDNを参考にすれば可能なんですがモーダル内でモードレスを実装するのがめんどい。
決め撃ちで書けばいいんだけど今後の拡張性とか考えて汎用性持たせようとするにはめんどい。
めんどい。
でもいつかは作らなくちゃならない、そんなものだと認識しているもの。
ダイアログボックスめんどい。
巷にあふれるダイアログボックス作成方法ではマクロがどうとかリソースがどうとか。
そんなに素敵な環境じゃねーんだよ。
CreateDialogだって中身はCreateWindowEx だしCreateToolbarとなんら変わりない。
ResEdit使って作るのもいいんですが何かと不安多し、Dに。
モーダルダイアログは簡単に実装できるんですがモードレスがめんどい。
モードレス単品で作るにはMSDNを参考にすれば可能なんですがモーダル内でモードレスを実装するのがめんどい。
決め撃ちで書けばいいんだけど今後の拡張性とか考えて汎用性持たせようとするにはめんどい。
めんどい。
2009年2月2日
クラス
やる気がなくなってきたので気分転換にクラスを作ってみた。
ほっとんどがNeGuiからの流用だったり。
クラスが便利な機能だということは、まぁ実際に使ってるんで分かるんですがインターフェイスの何が便利なのかどういった場面で使うのかがいまいち分からんです。
抽象クラス使えば列挙体・フィールド・メソッドが共通項目で実装出来るんだし闇雲にインターフェイスの多重継承しなくても済みますし。
やっぱ、あれなんだろうなぁ。
一人でちまちま書いてるから分からないんだろうなぁ。
abstract class Gui {
protected HANDLE hItem;
this(HWND hWnd) {
hItem = hWnd;
}
final HWND opCall() {
return hItem;
}
/// 以下それっぽいコード
}
class Window: Gui {/* ... */}
class Control: Gui {/* ... */}
abstract class Button: Control {/* ... */}
class PushButton: Button {/* ... */}
class CheckButton: Button {/* ... */}
class RadioButton: Button {/* ... */}
class ToolBar: Control {/* ... */}
ほっとんどがNeGuiからの流用だったり。
クラスが便利な機能だということは、まぁ実際に使ってるんで分かるんですがインターフェイスの何が便利なのかどういった場面で使うのかがいまいち分からんです。
抽象クラス使えば列挙体・フィールド・メソッドが共通項目で実装出来るんだし闇雲にインターフェイスの多重継承しなくても済みますし。
やっぱ、あれなんだろうなぁ。
一人でちまちま書いてるから分からないんだろうなぁ。
2009年2月1日
2009年1月30日
いつも知人にもらってたけど今日生まれて初めて傘を買った
営業:
「なぁなぁ、sk君」
sk:
「なんすか」
営業:
「ロト6当たらへんかなぁ?」
sk:
「いや、頼み事みたいに言われても」
営業:
「当たったらいいや~ん」
sk:
「まぁ確かにいいですね、当たれば。
俺もよく買ってない宝くじ当たらへんかなぁっとか考えますし」
営業:
「買ってないもん当たるかい」
sk:
「買っても当たらないですけどね」
営業:
「俺なぁ、思うんやわ。
神様って忙しいんとちゃうんかと。
でな、俺が祈ったところで神様んとこまで届かへんねやわ。
だから神様に祈るとき両手合わせてお祈りした後にな、
住所と電話番号と名前
を伝えることにしてんねん」
sk:
「末期すね」
「なぁなぁ、sk君」
sk:
「なんすか」
営業:
「ロト6当たらへんかなぁ?」
sk:
「いや、頼み事みたいに言われても」
営業:
「当たったらいいや~ん」
sk:
「まぁ確かにいいですね、当たれば。
俺もよく買ってない宝くじ当たらへんかなぁっとか考えますし」
営業:
「買ってないもん当たるかい」
sk:
「買っても当たらないですけどね」
営業:
「俺なぁ、思うんやわ。
神様って忙しいんとちゃうんかと。
でな、俺が祈ったところで神様んとこまで届かへんねやわ。
だから神様に祈るとき両手合わせてお祈りした後にな、
住所と電話番号と名前
を伝えることにしてんねん」
sk:
「末期すね」
2009年1月26日
ExceptionとErrorとエラー処理
- まだだ、まだ終わらんよ!
→Exception - 我が生涯に一片の悔い無し!
→Error
プログラムの流れとしてはこいつらが飛んで来た時に受け止めて何か処理、受け止められなければさようなら。
そいでですね、こいつらを受け止めた際にメッセージか何かを表示させるのが王道だと思うんですが、そこに表示させるメッセージってException.toString()とかそのまま表示させて良いもんなんでしょうか。
正直ユーザーからしたらstd.utf.UtfException: illegal UTF-16 valueなんて表示されても「なにコレ? バカ?」としか思わないんじゃないんだろうか。
組んでる人間も「知るかよ、動けよ」としか思わないわけですし(俺だけか)。
こういった場合に一番良いのは何だろう。
- タイトル:例外発生
メッセージ:UTF-16文字列が不正です
詳細:std.utf.UtfException: illegal UTF-16 value - タイトル:文字列処理失敗
メッセージ:入力された文字列を処理できません。※UTF-16文字列を使用してください。
詳細:std.utf.UtfException: illegal UTF-16 value。 - タイトル:エラー
メッセージ:std.utf.UtfException: illegal UTF-16 value
2009年1月25日
例外とAccess Violation
import std.stdio;
void main() {
Test test;
writeln(test.toString);
}
class Test {
override string toString() {
return "test method.";
}
}
> dmd -run Z:\test.d
> object.Error: Access Violation
頼むからもう少しまともなエラーを出してくれないか、DMD。
インスタンス生成してないことに気付くのに10分はかかったよ。
先頭からこんなこと書いてますが何が言いたいかというと、
Visual Studioが素晴らしすぎる。
DMDだけだと開発効率最悪な感じがします。

あの時このプログラムはどうなって死んでしまったか、といった情報も分かりにくいんでとりあえず-debugではstd.writeでログ書き出し、そしてひたすら追う。
それはそれでD(実質DMDがD言語)っぽいから面白いんですがねぇ…?
はやくIDEが欲しいです。
純正、って言うのもおかしいですがD専用のIDEが。。。
2009年1月23日
2009年1月19日
仕事場でのRDPが革命過ぎて窓際一直線
最近家に帰るのが早くて20時には帰宅しています。
いや~、仕事が無いってのも疲れるなぁ。
今年度の前期が嘘のようですよ。
で、帰宅が早いのでネムぃに取り組む時間が増えました。
ちょっと贅沢にメモリを使いまくって快適にプログラミング、
のはずだったんだけど詰んだ。
もう精一杯詰んだ。
@文字列
ああ、わかってるさ。
Dの文字列が0終端じゃないってことくらい十二分に分かってるよ。
むしろ変に理解してたから駄目だった。
ネムぃの内外(D部分とWin32API部分)の橋渡しはTextって構造体が担当してるんだ。
省略して書くと
こんな感じで内部に ptr ってメッソドがあるんだ。
こいつが駄目だった。
text配列とnullを結合してたんだ。
コレで大丈夫だと思ってたんだ。
ここで0終端文字列を作ってると思ってたんでこいつをあっちゃこっちゃに使ってたんだ。
一通りの基盤部分が作り終わってメインウィンドウだけの結合をやってみる。
アイコンハンドル取ってくる関数でやたら落ちたりメニュー表示文字列がゴミつきだったりと散々なことに。
アイコンハンドル取得してるところは失敗したときに例外投げるようにしていてまだぜんぜんcatch書いてなかったので落ちても構わなかったんですが文字列にゴミが付くのはいただけない。
2-3時間ひたすら目で追ったりstd.stdio.writeしたり-covしたり。
でもね、writeで書き出される文字列はText構造体を表示させてたので当然引っかからない。
もう最後の望みを掛けてText構造体にメス入れ。
ゆっくり見直して text ~ null に違和感を。
あれ? この null ってホントに 0 なのか?
空配列っぽくね?
ああ、修正したら直ったさ。
アイコンハンドル取得するところもアイコンアドレスにゴミ混じってたから落ちてただけさ。
@GC
もはや何も語るまい。
いや~、仕事が無いってのも疲れるなぁ。
今年度の前期が嘘のようですよ。
で、帰宅が早いのでネムぃに取り組む時間が増えました。
ちょっと贅沢にメモリを使いまくって快適にプログラミング、
のはずだったんだけど詰んだ。
もう精一杯詰んだ。
@文字列
ああ、わかってるさ。
Dの文字列が0終端じゃないってことくらい十二分に分かってるよ。
むしろ変に理解してたから駄目だった。
ネムぃの内外(D部分とWin32API部分)の橋渡しはTextって構造体が担当してるんだ。
省略して書くと
struct Text {
/// 実態。
wchar[] text;
}
こんな感じで内部に ptr ってメッソドがあるんだ。
こいつが駄目だった。
struct Text {
wchar[] text;
wchar* ptr() {
return (text ~ null).ptr;
}
}
text配列とnullを結合してたんだ。
コレで大丈夫だと思ってたんだ。
ここで0終端文字列を作ってると思ってたんでこいつをあっちゃこっちゃに使ってたんだ。
一通りの基盤部分が作り終わってメインウィンドウだけの結合をやってみる。
アイコンハンドル取ってくる関数でやたら落ちたりメニュー表示文字列がゴミつきだったりと散々なことに。
アイコンハンドル取得してるところは失敗したときに例外投げるようにしていてまだぜんぜんcatch書いてなかったので落ちても構わなかったんですが文字列にゴミが付くのはいただけない。
2-3時間ひたすら目で追ったりstd.stdio.writeしたり-covしたり。
でもね、writeで書き出される文字列はText構造体を表示させてたので当然引っかからない。
もう最後の望みを掛けてText構造体にメス入れ。
ゆっくり見直して text ~ null に違和感を。
あれ? この null ってホントに 0 なのか?
空配列っぽくね?
struct Text {
wchar[] text;
wchar* ptr() {
return (text ~ cast(wchar)0).ptr;
}
}
ああ、修正したら直ったさ。
アイコンハンドル取得するところもアイコンアドレスにゴミ混じってたから落ちてただけさ。
@GC
もはや何も語るまい。
登録:
投稿 (Atom)