PCの最近のブログ記事

antidevice.png
まずAntiDeviceは、パスの先頭一致で排除と許可が指定できるようになりました。特定メーカー(VID_****)などに限定することができます。
また64ビット版のファイル名をAntiDevice64.exeとし、64ビット版WindowsでAntiDevice.exeが起動された場合にAntiDevice64.exeを自動で起動するようにしました。

deltaend04.png次にDeltaEndは、ATOK 2011対応と、カナキーの指定ができるようになったことなどです。

いずれもホームページ側のWin32コーナーにて。

遺物

| コメント(0) | トラックバック(0)
仮想PCをバックアップせずに某ソフトの体験版を入れてしまいました。

別に再度インストールするつもりはないので気分の問題ですが、試しに全情報の削除を試みたところ、レジストリにもアクセス権限の設定があったことを実感するものが見つかりました。

保存箇所そのものは極めて常識的な場所、しかし管理者権限であろうと、ユーザーからは簡単には見ることも消すこともできない、という考えられたものでした。

企業名やソフト名と無関係な場所にこっそり残すのと違い、とても礼儀正しい実装だと思います。そのせいで発見されてしまったわけですが。

ウイルスのように徹底的に隠匿するか、建前で可能な範囲に限るか。営利だけを考えれば前者ですが、何かあった時のことを考えると、この方が安全ではあります。

Vista以降のアクティベーションですら破られていると聞きますから、体験版を体験だけに限らせる確実な方法もないのでしょうが、それでも綺麗な実装をしていることには感動さえしてしまいました。

買っちゃいましょうかね。

Word 2007と欧文

| コメント(0) | トラックバック(0)
pnpcom.rtfというファイル名の、欧文の文書があります。いわゆるRS-232C機器向けプラグアンドプレイの仕様書で、マイクロソフトが公開しているものです。

この中にCourierが指定された、文字によるタイミングチャートが含まれています。バックスラッシュが円記号になるぐらいならいつものことですが、Word 2007では全体がずれてガタガタになってしまいます。

当時のOpenOffice 3.1で綺麗に開けたので、そのままPDFにして追求していませんでしたが、レイアウトオプションに半角スペースをずらしてしまう凶悪なものが存在していることに気付きました。

「半角文字と全角文字の文字幅を調整しない」

それともう一つ、おなじみの
「バックスラッシュを円記号(¥)に変換する」

この2つのチェックを外すと綺麗に開けました。

「Wordのオプション」~「詳細設定」、下の方の「レイアウトオプション」です。デフォルトの変更はできないようなので、崩れる文書にいちいち設定の必要があります。

固定ピッチのスペースにまで介入するとか、開発者や評価手順を疑います。下品な言葉がポンポン飛び出すぐらいに苛つかせてくれます。

自分のところのMSDNの公開文書さえチェックできないなら、全部PDFにでも予め変換してもらいたいものです。

Shell_NotifyIcon

| コメント(0) | トラックバック(0)
通知領域に入れるようなアプリケーションは常駐型が多いでしょう。

となるとスタートアップか、Vista以降だと管理者権限のログオン時タスクで起動をすることが多いと思います。

Windowsの起動中は色々面倒くさいのですが、Shell_NotifyIconも例外ではありません。

登録に失敗する場合、GetLastError()がERROR_TIMEOUTを返すものだと思っていましたが、タスクからの起動だとタイミングがもっと早いため、ERROR_FILE_NOT_FOUNDが返っていました。

タスクバーの通知領域(実体はツールウィンドウ)が見つからない場合に起こるそうな。ただしその後でTaskbarCreatedのメッセージが来るので、リトライせずともそちらでカバーできます。

何か原因不明のエラーで無限ループになっても困るので、リトライするならこの2つの場合だけにするか、回数制限をするのが良いのでしょう。

DeltaEnd Ver.0.45公開

| コメント(0) | トラックバック(0)
deltaend04.pngBoot CampのCtrl + 1アイコン再登録、それにATOK 2008のタブ同時確定をメインとしたDeltaEndの刷新版を公開しました。
DeltaEnd 0.45

最近試した色々が盛り込まれ、32ビット版と64ビット版が同期して動作するものになっています。

ATOKのタブ同時確定は今のところ2008専用ですが、新しいのを購入することがあったら更新するでしょう。

実はThinkPad X61tが壊れてMacBook Pro(15.4)を導入しました。手持ちの2008というのがMac+Windows版でして、Lionも出たので新しくしたいのですがいつになるやら。

32/64共同作業

| コメント(0) | トラックバック(0)
64ビット版Windowsにおける一部ユーティリティは、32/64両方のバイナリを動作させなければならない場合があります。

この場合、32ビット版を主体とし、64ビット依存の部分だけ子プロセスを呼んだり、一歩進んでアーキテクチャ依存部と非依存部に分離させ、依存部を子プロセスにしたりするでしょうか。

個人の趣味レベルであれば、同一ソースコードから2つのバイナリを作り、両方とも動作させても構わないでしょう。ただ設定ぐらいは連動させ、可能であればマスター/スレーブとしてそれぞれ振る舞わせ、スレーブ側はUIを表示しないようにしたいところ。

というわけで、平たく言えばATOK2008タブ同時確定Bootcampアイコン再登録をDeltaEndに組み込むため、ファイルマッピングを利用して協調動作させるクラスとそのサンプルアプリを作ってみました。

SyncRun.zip

起動するとプロセスが2つ立ち上がります。マスター側のエディットボックスに入れた数字をスレーブ側に伝えることができ、マスター終了でスレーブも終了しますが、スレーブは単独で終了・再立ち上げ可能です。32ビット版、64ビット版の混在可能、どちらもマスター・スレーブ双方になれます。

このサンプルではアーキテクチャを判別していないので、32ビット版同士/64ビット版同士での動作もできますが、DeltaEndに組み込んだ際にはIsWow64Process APIの戻り値を参照したフラグを入れています。

シングル/マスター/スレーブのモード判別ができ、それに応じてUIを切り替えることができます(もちろんアプリの実装として)。

スレーブが消え失せた場合の処理は少し入れてありますが、マスターが消え失せた場合のスレーブ終了処理はまだ入っていません。タイマーを使って1分毎ぐらいでマスターにWM_NULLをPostMessageするといったあたりでしょうか。

Boot CampとTaskbarCreated

| コメント(0) | トラックバック(0)
4.0は知りませんが、3.xまでのBoot Campはタスクバー再生成の際にアイコンが登録されません。

外部ツールがついでに登録できないかと32ビット版3.2と64ビット版3.3で調べたところ、NOTIFYICONDATAのuIDに0x86を設定することで、他は普通に可能でした。

メッセージを飛ばす相手のウィンドウは、クラス名"Afx:00400000:0"(3.2/32)又は"Afx:000000013FF20000:0"(3.3/64)ですが、2つあるので大きさで判別する必要があります。目的のブツは10x10のものです。

クラス名でなくプロセス名がBootcamp.exe(2.xまではKbdMgr.exe)であるのを確認しても良いでしょう。こちらが参考になります。Bootcamp.exeの在処は、決め打ちでなければプロセス名のフルパスから取るのが正しいですから。

なおアイコンのリソースIDは128、コールバックのメッセージはWM_USER+10です。

exeをLoadLibraryしてLoadIcon(LoadImage)して、Shell_NotifyIconしてFreeLibraryすれば完了です。TerminateProcessして再起動するより行儀の良い再登録が行なえます。

Paint.NETとTWAIN

| コメント(0) | トラックバック(0)
先月末、COMサーバーについて書きました。これが64ビットWindowsにおけるTWAINの話だったのですが、形になりました。

TWAINLocalServer.zip

Paint.NETでTWAINを使うものとして、効果プラグインのTwainableというのが既にありますが、64ビット環境では動作しませんでした。またクリップボードに入れるところまでしか行なわないらしいので、もう一手間かかりました。

こちらはファイルタイプのプラグインとして作ってあり、拡張子pdtwainを開くとTWAINから読み込みます。またアウトプロセスCOMサーバー経由なので、64ビット32ビット問わず動作します。スキャナの選択は通知領域から行ないます。

pdtwain.dllとTWAINLocalServerLib.dllをPaint.NETのFileTypesフォルダにコピーしてください。その上で、TWAINLocalServer.exeを適当な場所にコピーし、
TWAINLocalServer.exe -RegServer
として登録してください(管理者権限が必要)。登録解除は
TWAINLocalServer.exe -UnregServer
です(同じく)。

ベースとして、らんゆうじろう氏のCTWAINManagerを使っています。スキャンのウィンドウとスキャナ選択とを自動で切り替えるため、処理が完了してから行なえるようPostMessageをいくつか追加しました。

...というのが、そもそもTWAINが64ビット非対応というところから始まったものでした。公式TWAINは対応を果たしているのですが、Windows同梱の古い仕様のものは未対応なのです。

AnyCPUマネージドアプリであるPaint.NETから呼ばれるTwainableは、64ビット環境ではアンマネージドDLLとして64ビット版を要求するのですが、TWAINのDLL本体はWindowsフォルダの32ビット版しか存在せず、読もうとして落ちていたわけです。

そこでCOMサーバー。しかし肝心のデータの受け渡しをどうしたものかと試行錯誤をし、結局SAFEARRAYにまで手を付けました。ファイルマッピングでも良いのですが、不慣れなマネージド側の処理が楽になるので、マネージド配列として扱えるSAFEARRAYは好都合だったのです。

ちなみにタスクメモリは32/64の垣根を越えることができませんでした。ハンドルではなく直接アドレスを扱うAPIだからでしょうか。タスクメモリを使わなければデュアルインターフェース/オートメーションが使えるので、これはこれで悪い話ではありませんが。

まだエラー対策が不充分なのと、TWAINのウィンドウが背後に隠れる場合があるので、もう少し改良してからホームページ側で公開します。

今さらのもの

| コメント(0) | トラックバック(0)
GadgetScrew.pngWindows Vistaのサイドバーガジェットが左にずれていくのを防止するツールを公開しました。
GadgetScrew Ver.0.7

Vistaのサポートが来年春に切れるというのに、あまりにも今さらですが。BusinessとEnterpriseはまだ使うでしょうから、有用でないこともないでしょう。

ガジェットの追加・削除にも追随できるようにしてあります。

名前の元ネタは「モンティ・パイソン」でジョールが法廷に立つシーンです。
企むことがあってCOMの学習中。

既に廃れつつあって参考書が少ない中、いきなりアウトプロセスのサーバーに挑戦です。

32ビットしか提供されていないアンマネージドDLLを、64ビットのマネージドアプリから使う必要があり、32/64相互運用はアウトプロセスCOM経由が一つの方法だと目にしたもので。

CodeGuruにC++で記述したアウトプロセスサーバーのサンプルがありました。Windows SDKのDCOMサンプル"Simple"よりわかりやすいと思います。

またMSDNにC#クライアントの解説がありました。

IDLファイルがあればタイプライブラリのTLBファイルが作られるので、tlbimpしてアセンブリファイルを作り、参照設定から「参照の追加」してやれば良いとわかりました。

コードはこうなりました。

namespace CSClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Server.MiniDcom d = new Server.MiniDcom();
            Server.IDouble id = (Server.IDouble)d;
            int r0, r1;
            r0 = 10;
            r1 = id.Double(r0);
            Console.WriteLine(r0 + "->" + r1);
        }
    }
}
<<前のページへ 910111213141516171819

アーカイブ

ウェブページ

Powered by Movable Type 5.2.13

ホームページ