...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

DFL rev 81 + dmd 2.038

c:\d\dmd2\src\dfl\internal\winapi.d(2078): Error: long has no effect in expression (0)

長らくこのエラーのせいでDFLが新しいdmdで使うことができなかったが,やっと原因がわかった.
他の人はすぐ直せていて困っていなかったのだろうか?


報告されている場所はここ.

	enum: LRESULT
	{
		TBDDRET_DEFAULT = 0, // <<<<<<<<<<<<<
		TBDDRET_NODEFAULT = 1,
		TBDDRET_TREATPRESSED = 2,
	}

なんでやねん,と.


で,ふとTBDDRET_DEFAULTで全文検索してみたら,使っている場所は一カ所だけだった.

	protected override void onReflectedMessage(ref Message m)
	{
		switch(m.msg)
		{
			case WM_NOTIFY:
				{
					auto nmh = cast(LPNMHDR)m.lParam;
					switch(nmh.code)
					{
						case NM_CLICK:
							{
								auto nmm = cast(LPNMMOUSE)nmh;
								if(nmm.dwItemData)
								{
									auto tbb = cast(ToolBarButton)cast(void*)nmm.dwItemData;
									scope ToolBarButtonClickEventArgs bcea = new ToolBarButtonClickEventArgs(tbb);
									onButtonClick(bcea);
								}
							}
							break;
						
						case TBN_DROPDOWN:
							version(DFL_TOOLBAR_NO_MENU) // This condition might be removed later.
							{
							}
							else // Ditto.
							{
								auto nmtb = cast(LPNMTOOLBARA)nmh; // NMTOOLBARA/NMTOOLBARW doesn't matter here; string fields not used.
								auto tbb = buttomFromID(nmtb.iItem);
								if(tbb)
								{
									version(DFL_TOOLBAR_NO_MENU) // Keep this here in case the other condition is removed.
									{
									}
									else // Ditto.
									{
										if(tbb._cmenu)
										{
											auto brect = tbb.rectangle;
											tbb._cmenu.show(this, pointToScreen(Point(brect.x, brect.bottom)));
											// Note: showing a menu also triggers a click!
										}
									}
								}
							}
							return TBDDRET_DEFAULT; // <<<<<<<<<<<<<<<<<<<<<<<
						
						default: ;
					}
				}
				break;
			
			default: ;
				super.onReflectedMessage(m);
		}
	}

こいつかー・・・ん?

	protected override void onReflectedMessage(ref Message m)

・・・.
戻り値型が void だと・・・?
お前のせいかあああ!


ってわけで,return 文をコメントアウトしたらコンパイルできるようになりましたw
MSDN によると,TBDDRET_DEFAULT という値は確かにどこかで返さなければいけないみたいだけど,onReflectedMessage は何も返すことができないので,周辺の設計がおかしいのではないだろうか?
後で Chris に報告しなきゃ.

恒例の patch を作ったので D2 ユーザの人は勝手に持って行ってください.
http://rayerd.plala.jp/pukiwiki/ingwiki/index.php?plugin=attach&refer=DFL&openfile=patch_dfl_rev81_dmd2038.zip
D1 ユーザは動いたらラッキーってことで.

  • 主な変更点
    • inoutをrefに
    • onReflectedMessageのバグの修正
    • opEqualsがref constを要求することへの対応