2010 年 1 月 のアーカイブ

SilverlightのTestPage.htm自動生成をやめる




















やめる、というか、HTMLのobject要素内にparamとか追加したかったので、別ページを用意して、そのファイルをビルド時に実行してくれるようにしたいのです。

ASP.NETのプロジェクトがくっついている場合はそちらを修正すればいいのですが、Silverlightプロジェクトを単体で作ってしまった場合用。

環境はVisual Studio 2010 ベータを使っています。

メニューの[プロジェクト]から、[新しい項目の追加]、[HTMLファイル]を選択して1ページ作成してやります。

スケルトンのHTMLがエディタに表示されるので、Silverlightを呼び出すタグを書きます。自動生成されたTestPage.htmの内容でもコピーして作ると楽。

ちなみに実行自体はプロジェクトのルートフォルダにできるので、xapファイルのパスの前にBin/debug/などをつけてやる必要あり。(出力ディレクトリにコピーできるけど、コピーしてもそちらが実行されるわけではない)

で、プロジェクトのプロパティで、デバッグ→開始動作のラジオボタンを[テスト ページを動的に生成する]から[ページを指定する]に変更して、htmlファイルを選択。完了。


Encoding.GetString(Byte[])はSilverlightで使えない




















今日のびっくり。

‘System.Text.Encoding.GetString(byte[])’ はアクセスできない保護レベルになっています。

Encoding.UTF8.GetString(data);

こんなコードを書くとビルド時エラーになります。

なぜか、Encoding.GetString(Byte[], Int32, Int32)は使えます。

Encoding.UTF8.GetString(data, 0, data.Length);

こうしておけばOK。何だろう、この仕様。


今日の微妙エラー




















コントロールはひとつの case ラベル (‘default:’) から別のラベルへ流れ落ちることはできません。

switch (message)
{
    case "hoge":
        funcA();
        break;
    default:
        funcB();
        break; // これがないとエラー
}

他の言語のクセでbreak書かなかったら起きた。

「フォールスルー」ってことなんですね。

ちなみにcaseのあとのブロックにコードを書かなければフォールスルーはできるという話。


Windowsフォームへの、やたら簡単なSilverlightホスティング方法




















  1. VisualStudioでフォームをひとつ作ります。
  2. WebBrowserコントロールを配置します。
  3. フォームのLoadイベントに以下を記述。
        private void Form1_Load(object sender, EventArgs e)
        {
            string html = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">
<!-- saved from url=(0014)about:internet -->

<html xmlns=""http://www.w3.org/1999/xhtml"" >
 <head>
  <title>Test</title>

  <script type=""text/xaml"" id=""testXaml"">
<?xml version=""1.0""?>
<Canvas xmlns=""http://schemas.microsoft.com/client/2007"">
 <Ellipse Fill=""Pink"" Width=""200"" Height=""100"" Canvas.Left=""40"" Canvas.Top=""30"" />
 <Rectangle Fill=""Orange"" Width=""100"" Height=""160"" Canvas.Left=""150"" Canvas.Top=""50"" />
 <TextBlock Text=""This is text on Silverlight"" Canvas.Left=""10"" Canvas.Top=""150"">
  <TextBlock.RenderTransform>
   <RotateTransform Angle=""-30"" />
  </TextBlock.RenderTransform>
 </TextBlock>
</Canvas>
  </script>
 </head>

 <body>
   <object type=""application/x-silverlight-2"" width=""800"" height=""600"">
   <param name=""source"" value=""#testXaml""/>
  </object>
 </body>
</html>";
            if (webBrowser1.Document == null)
            {
                webBrowser1.Navigate("about:blank");
            }
            webBrowser1.Document.OpenNew(true);
            webBrowser1.Document.Write(html);
        }

結果

20100127103949

XAMLソースはこちらから拝借。

【コラム】The Silverlight Times (16) 覚えておきたい「インラインXAML」 | ネット | マイコミジャーナル

WebBrowserの使い方はこちらを参考にしました。

WebBrowserコントロールのコンテンツを文字列により設定するには?[2.0、C#、VB] - @IT


ビルド時ぬるり




















以前Visual Studio 2005で作ったプロジェクトをベータ版のVisual Studio 2010に持ってきて、NotifyIconとContextMenuStripを追加しようとしたら、ビルド時に
オブジェクト参照がオブジェクト インスタンスに設定されていません。 Form1.resx
というエラーが発生。

どうも.NET Frameworkの2.0のDLLを参照しているのにForm1.resxでは4.0とか書いてあるのが問題のような気がするのだけど…?
参照先のパスはこんな感じ。
C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll

何とか変更しようと試みたけど、参照削除→新しいファイル追加でも、古いほうのDLLを見に行ってしまうみたいで、書き換えられず。
結局プロジェクトのターゲットフレームワークを.NET 3.5にしていたのが問題のようなので、4.0にしてみたら一応通りました。

配布できるのか?これ。


Windows 7 x64でのVirtual PCとdebian




















Windows 7 x64環境のWindows Virtual PCに、以前Vista 32bit版のMicrosoft Virtual PC 2007で使っていたdebian Lennyの仮想マシンを持ってきて起動させようとしたら、ブートの途中で何もエラーも表示せずに応答しなくなってしまったので対策を調査。

多分Windows 7どうこうではなくて、64bit版だということが問題っぽい。

MicrosoftVirtualPc2007/lenny – Debian Wiki

noreplace-paravirtパラメータを追加しておけば良いだけ。

まぁ、すでに設定していた場合は何もせずに移行できたって話ですね。Windows Virtual PCとVirtual PC 2007間での互換性問題はほとんどなさそう。

追記

NICを認識しない…やっぱりdebianを64bit版にするしかないのか…?


自作ドライバを配布するためのインストーラー




















DPInst.exeというものがとにかく便利すぎたのでメモ。

何せ上記実行ファイルを配布したいinfと同じフォルダに置くだけ。DPInst.exeを実行すればインストールが開始されます。

参考にしたのはこちらのサイト。

DPInst.exeの使い方 / How to use DPInst.exe WinUSB.sys事始め/ウェブリブログ

インストール画面をカスタマイズしたい場合に限り、定義XMLファイルを設置すればいいようです。

サンプルとして使えるXMLや画像一式は以下のフォルダにあります。

C:\WinDDK\7600.16385.0\src\setup\DPInst

日本語の場合はlanguage codeに0x0411をセット。

<language code="0x0411">

あとはUTF-8にして日本語で記述できます。

0x0411を定義しておかないと、

現在の言語では、デバイス ドライバのインストール ウィザードはサポートされません。

このパッケージを提供した製造元に問い合わせてください。

と表示されて先に進めません。

ちなみにNSISでやることを最初考えていて、それは以下のページに書いてありました。

Driver installation and update – NSIS

こっちはまだ試していないのですが、アプリケーションとかも一緒にインストールする場合にはNSISの方が便利かも。


hid.libをリンクしようとしたときにLNK2001エラーになる問題




















MUDFでドライバ開発中なのですが、hid.libを使いたくて、sourcesにhid.lib追加、internal.hにHidsdi.hのインクルード記述をしてみたところ、ビルド時にLNK2001エラーが発生。

結局はHidsdi.hがCソースなのでextern "C"{}で囲ってやればOKというお話です。

extern "C"{
#include <Hidsdi.h>
}


Windows 7でファイル所有者と書き込み権限をコマンドプロンプトから操作する




















多分Vistaも同じだと思うのだけど、HDDを別のマシンに移した際、アクセスできない・消せないファイルが大量にあったので、それらをまとめてコマンドプロンプトからコマンドで再帰的に処理すべくやったことと注意点のメモ。

Program Files以下のフォルダ・ファイルの所有権を自分のPCの管理者に変更する
takeown /F "Program Files" /R /A

Everyoneに対してフルコントロール権限を与えて、誰でも編集できるようにする
icacls "Program Files" /grant Everyone:(F) /T

注意しないといけないのは、フォルダを辿るときに、NTFSのJUNCTIONも辿ってしまうので、ジャンクションは先に消しておいた方がいいかも。
そうしないとうっかり現行のシステムファイルを消しかねない。
というか実際、現行システムのACL書き換えをやらかした。
まさに「FドライブのUsersフォルダの権限を書き換えていたら、いつのまにかCドライブの権限を書き換えていた…!」という状態。
怖い怖い。

ジャンクションかどうかの確認は、コマンドプロンプトからdir /aとかで。

シンボリックリンクも同じかな。どっちも使われているみたいなので注意。


py2exe+wxPythonでmyole4axが見つからないと言われる問題




















新規にPython環境セットアップして、何はともあれ既存のファイルに対してpy2exeをやろうとしてはまったメモ

py2exeでexe化したファイルを実行すると、下記のようなエラーが発生する。Pythonのバージョンは2.5と2.6のどちらでも再現。

  File "zipextimporter.pyo", line 82, in load_module
  File "wx\lib\flashwin.pyo", line 15, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "wx\lib\activex.pyo", line 44, in <module>
ImportError: cannot import name myole4ax

myole4axって何ぞ?

ファイル名  C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\lib\activex.py
44行目

from comtypes.gen import myole4ax

C:\Python25\Lib\site-packages\comtypes\comtypesフォルダはあるけど、C:\Python25\Lib\site-packages\comtypes\comtypes\genフォルダがありませんよ…

wx\lib\activex.pyの該当部分の周りを見てみると、

import wx

import ctypes as ct
import ctypes.wintypes as wt
import comtypes
import comtypes.client as cc
import comtypes.hresult as hr

import sys, os
if not hasattr(sys, 'frozen'):
    f = os.path.join(os.path.dirname(__file__), 'myole4ax.tlb')
    cc.GetModule(f)
from comtypes.gen import myole4ax

ということで、cc.GetModule(f)が実行されると、comtypes.genが生成されるってことなんですね。つまりpy2exeでexeにする前に一回実行しておく必要あり。

py2exeでは実行はせずにファイルをパッケージ化しているだけだから、生成されないままパッケージ化されてしまうというわけ。

もしくはこんな風に手で実行してもOK。

>>> import wx
>>>
>>> import ctypes as ct
>>> import ctypes.wintypes as wt
>>> import comtypes
>>> import comtypes.client as cc
>>> import comtypes.hresult as hr
>>>
>>> import sys, os
>>> f = os.path.join(r"C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\lib", 'myole4ax.tlb')
>>> cc.GetModule(f)
# Generating comtypes.gen._99AB80C4_5E19_4FD5_B3CA_5EF62FC3F765_0_1_0
# Generating comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0
# Generating comtypes.gen.stdole
# Generating comtypes.gen.myole4ax
<module 'comtypes.gen.myole4ax' from 'c:\Python25\lib\site-packages\comtypes\gen
\_99AB80C4_5E19_4FD5_B3CA_5EF62FC3F765_0_1_0.py'>
>>> 

comtypes.gen.ShockwaveFlashObjectsも同じようにエラーが出る場合があるので、同じ手段で対処できます。