01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
2008-06-29 Sun
2008-06-23 Mon
■ テンプレート・ミックスインでプロパティーを貼り付ける [D言語]
テンプレート・ミックスインが追加されたときに誰かが書いていたような気がする。
どこだったろう?
思い出せないので書いてみた。
import std.stdio; enum {Readable=1,Writable,ReadWrite} template Property(type,alias name,int flag=ReadWrite) { mixin(type.stringof ~ " m_" ~ name ~ ";"); static if(flag&Readable) mixin(type.stringof ~ " " ~ name ~ "(){return m_" ~ name ~ ";}"); static if(flag&Writable) mixin(type.stringof ~ " " ~ name ~ "(" ~ type.stringof ~ " a){return m_" ~ name ~ "=a;}"); } class Foo { mixin Property!(int,"bar"); //int 型 の bar という名前のプロパティ } void main() { auto foo = new Foo; foo.bar = 100; //bar に 100 をセット writefln(foo.bar); //bar を読み出す。 }
mixin文を使ってみた。
std.metastring.Format をつかいたいが、壊れている。
[2008-02-26-3]
■ DSSS が使う DMD を指定したい [D言語]
DSSS 0.75 は DMD 2.008 まで。
DMD 2.015 もつかいたい。
dsss build hoge.d
と
dmd hoge.d
DSSS が使う DMD を指定するにはどうすればいいのだろう?
--bindir= を指定するとコンパイルできるみたいだ。
Could not detect versions. のメッセージが気になる。
2008-06-20 Fri
■ UPnPデバイスの列挙 [C#]
2008-06-14-1 の C# 版
CoInitialize を書かない。
CoCreateInstance の代わりに new を使う。
BSTR は string
UPnPDevices を foreach でくるくる。
IUnknown.Release の代わりに Marshal.ReleaseComObject を使う。
using System; using System.Collections; using System.Runtime.InteropServices; using UPNPLib; namespace upnp_enum_dev { class Program { static void Main(string[] args) { ArrayList rcws = new ArrayList(); try { UPnPDeviceFinder df = new UPnPDeviceFinder(); rcws.Add(df); UPnPDevices ds = df.FindByType("upnp:rootdevice", 0); rcws.Add(ds); foreach (UPnPDevice d in ds) { rcws.Add(d); Console.WriteLine(d.FriendlyName); } } finally { foreach(object obj in rcws) { try { Marshal.ReleaseComObject(obj); } catch { } } } } } }
リソースの解放は D言語の scope(exit) のほうが見やすい。
2008-06-19 Thu
■ IDispatch
IDispatch ITypeInfo TypeLib
Inside OLE
http://d.hatena.ne.jp/seraphy/20061030
IDispatch の実装は ITypeInfo に任せる。
ITypeInfo は ITypeLib から取得する。
ITypeLib は LoadTypeLib 等から取得する。
LoadTypeLib 等で読み込む TypeLib はリソースに含める。
TypeLib は MIDL で IDL からコンパイルする。
2008-06-16 Mon
■ UPnP に関する日本語の資料
UPnP Forum Summit - Asia - Nov. 11-12, 2002
パワーポイントのスライドがある。
2008-06-13 Fri
■ IDL を D言語 に [D言語]
IDL
interface IUPnPDeviceFinder : IDispatch { ... HRESULT FindByType([in] BSTR bstrTypeURI, [in] DWORD dwFlags, [out, retval] IUPnPDevices ** pDevices); ...
この COM を D からつかうのに、
IUPnPDeviceFinder : IDispatch { ... HRESULT FindByType(BSTR bstrTypeURI, DWORD dwFlags, IUPnPDevices ** pDevices); ... } IUPnPDevices devices; FindByType(cast(IUPnPDevices**)&devices);
と、
IUPnPDeviceFinder : IDispatch { ... HRESULT FindByType(BSTR bstrTypeURI, DWORD dwFlags, IUPnPDevices * pDevices); ... } IUPnPDevices devices; FindByType(&devices);
のどちら良いのだろう?
両方とも 実行時エラーは出ていない。
たまたまだろうか?
前者は、キャストが疑問。
後者は、IDL と違う宣言。
2008-06-12 Thu
■ コントロールポイント [D言語]
D言語で UPnP コントロールポイントを作ってみた。
CoInitialize で初期化して。
CoCreateInstance で IUPnPDeviceFinder を作って。
IUPnPDeviceFinder からデバイスを列挙して。
デバイスから文字列を取得する。
ここまでできた。
BSTR を wstring に変換するコードを書いた。
toString(const char* s) をまねした。
wstring toString(const BSTR s) { return s ? s[0 .. SysStringLen(s)].idup : cast(wstring)null; }
http://www.upnp.org/download/upnpsummit6Asiaslides/J_WindowsCESDK-MiroJuric.ppt
日本語のスライド
UPnP APIs
MSDN 英語
日本語訳が無い。
2008-06-10 Tue
■ COM
Insile OLE
Inside COM
Effective COM
Essential COM
Dr. GUI と COM オートメーション、第 1 部
COM DLL をレジストリに登録しないで使用する方法 (COM DLL の Side-by-Side 実行
Windows XP で分離アプリケーションと Side-by-Side アセンブリをビルドし、サービスを提供する方法