前の月 / 次の月 / 最新

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

DSSS と DMD の共存 [D言語]

DSSS は、特定のバージョンの phobos を要求する。
dsss\include\d に特定のバージョンの phobos を入れるといいようだ。

-I で指定してもできる。こっちの方が普通のやり方だろうか?
dsss.conf で指定できそうな気もする。

[2008-06-23-1]

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. のメッセージが気になる。

Referrer (Inside): [2008-06-29-1]

2008-06-21 Sat

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) のほうが見やすい。

参考
COM Interop, Marshal.ReleaseComObject

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-14 Sat

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 英語
日本語訳が無い。

DSSS [D言語]

DSSS 0.75 は DMD 2.008 まで。
DMD 2.009 以降は動かない。

DSSS 0.76 は DMD 2.012 が対応しているようだ。
でもまだリリースされていない。

2008-06-10 Tue

過去ログ

2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12