Win32

再考:Visual C++ 9.0 SP1のランタイム問題

先日、「Visual C++ 9.0 SP1のランタイム問題」で書いた問題は、本当は問題なのかどうなのか。仕様といわれればそれまでっぽい。難しいのは、いままで、VS2003, VS2005は、SP1が当たったバージョンと当たってないバージョンでランタイムが異なっていたことだ…

Visual C++ 9.0 SP1のランタイム問題

問題と言うほどでもないのだけれども、VC++9.0SP1でプログラムをリンク(/MD)すると、次のようなmanifest(これは64-bit版)が埋め込まれる。 <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> </requestedprivileges></security></trustinfo></assembly>

Visual Studio 2008 SP1

やっと、Visual Studio 2008 SP1がリリースされました。いろいろな修正がなされていますが、個人的に気になるのは、前回書いた、「Visual C++ 9.0のランタイム問題」について。そのまえに、一応、コンパイラバージョンについて調べておくと、VC++ 9.0では、 …

ユーザーに「サービスとしてログオン」権限を付与する

特定のサービスをユーザーアカウントで起動しようとすると、ユーザーにサービス権限がないことが問題になることがある。特にVistaでは、Administratorsに所属していてもこの権限がないので、いろいろとやっかいだ。これを解決するために、 // espresso3389と…

C#でUACに対応する

Windows Vistaで一部の処理で管理者権限が必要だが、起動時に管理者権限を要求するまでもないようなアプリがある。タスクマネージャやProcess Explorerはその典型例だが、こういうアプリにはシールドアイコンが付加されたボタンやメニューがある。このアイコ…

リモートプロセスのコマンドラインパラメータを取得する

自分のプロセスのコマンドラインを取得するのは非常に簡単だ。main関数が存在するならargc, argvで取得できるし、そうでなければ、__argv, __argv, (__wargv/__targv)で取得することもできる。また、APIとしては、GetCommandLineというものもある。好んで使…

JScriptのevalを使う

JScriptのevalを簡単なパーサーとして使うぐらいは、探せば腐るぐらい見つかるけど、戻り値の型についての記述は意外と少ない。 とりあえず、JScriptからの戻り値をstringにせずに返してもらって、その型を調べてみるコード。 using System; using System.Te…

ShellExecuteExで起動したアプリの制御

アプリを無理矢理動作させて、無理矢理印刷させるという、ある意味使い古されたスキームなんだけど、ウェブを探してもShellExecuteExを使った例は少ない。理由は簡単で、つい最近まで、プロセスハンドルから、プロセスIDを取得できなかったという簡単なこと…

AssocCreate on C#

P/Invoke.netにもなかったので作ってみた。COM関連のマーシャリングは意外と難しい。というか、しばらくやっていないと完全に忘れてしまう。 class Assoc { public static string GetAssociatedCommandLine(string ext, string verb) { try { object obj; As…

WOW64下での印刷

すっかり忘れていたので備忘録として書いておきます。WOW64の下で動作するアプリケーションが印刷を行う場合、その処理は、WOW64(32-bit)のプロセスから起動されたsplwow64.exeという代理プロセスによって行われます。詳しくはわかりませんが、プリンタドラ…

WIC一覧の取得

上記の方法で、いろいろなファイルが読み込めることがわかったが、一方で、WIC経由で開くことのできる(はずの)ファイル形式の一覧がほしいことがある。端的に言えば、「ファイルを開く」ダイアログのフィルターを作ったりするときに、*.*では格好悪すぎる。 …

画像を保存

処理が完了した画像を保存するには、IWICBitmapEncoderを利用する。 IWICBitmapEncoderのインスタンス作成時には、WIC GUIDs and CLSIDsにあるGUID_ContainerFormat*の中から、自分が使いたいフォーマットのエンコーダを選択する。 // TIFFエンコーダを作成 …

カラーマネジメント

WICでは、カラーマネジメントシステム(CMS)の利用もかなり簡単になっており、これらは、IWICColorTransformを利用して行う。また、上記のサンプルで、IWICBitmapFrameDecodeがIWICBitmapSourceにキャスト(QueryInterface)可能だったように、IWICColorTransfo…

Windows Imaging Componentで画像を読み込む

Windows Imaging Component (WIC)は、.NET Framework 3.0でも利用されている画像処理のフレームワークで、Vistaでは標準インストールされており、Windows フォトギャラリーなどでも利用されているほか、Windows XPでも、.NET Framework 3.5をインストールし…

low-fragmentation heap

会社で開発しているアプリケーションで、プログラムの[閉じる]ボタンを押しても数秒間固まったままになるものがあった。別に、WaitForXXXObject(s)しているわけでもないし、そんなに重い処理をしている訳でもない。理由がわからないまましばらく放置していた…

Visual C++ 9.0のランタイム問題

Visual C++ 9.0を使って共有DLL(/MD)でビルドしたコードを配布しようとすると(C++/CLIを利用すると必然的にこの状況になる)、CRTのDLLを配布する羽目になるんですが、これには、3つの方法があることになっています。 vcredist_x86.exeを利用する この方法は…

WOW64のファイルシステムのリダイレクトをOFFにする

会社で、WiXを使って、とあるプロジェクトのインストーラを作っているのですが、ほとんどは.NETなものの、一部のコードだけ、ドライバに依存するため、64bit対応するに当たって、system32(system64ではないんだなこれが。)にファイルをコピーしないといけま…

The remote procedure call failed

IDataObjectとIDropSourceを作って、エクスプローラ側にIStream経由でファイルをドロップする処理を作っているのだが、特定の環境(というか、家のWindows Vista x64環境)で、というダイアログが出て、アプリケーションが死んでしまう。アプリケーション側は…

IIS FTPで一時的にフォルダを公開する

ユーザー認証はしない(anonymous)けど、接続元IPを限定することによって、ある程度のセキュリティは維持でき、一定時間が過ぎると仮想ディレクトリごと削除する。そんな機能が必要になったので、適当に作ってみました。やってみると、意外と難しくない。とい…

Win32 File-ID APIs

Windows Vista/2008からは、File IDによるファイル処理が標準で実装されている。これは、NTFSとかでGetFileInformationByHandleを使って取得できるBY_HANDLE_FILE_INFORMATION::nFileIndex*と同じもの。ファイルIDがわかっていれば、IDとドライブ識別のため…

今の今までCreateProcessの第2引数の意味を勘違いしていた

今まで、 CreateProcess("hoge.exe", "arg1", ...); は、 argv[0] = "hoge.exe" argv[1] = "arg1" となると信じていて疑わなかったけど、実は、 argv[0] = "arg1" となることを今知り、愕然としました! 結局、UNIX系のプロセス開始システムコールとあまり変…

Windows Installerを汎用DBとして使えないか?

実際にやるとかやらないとかじゃなくて、Windows Installerが最近のPCならばほぼ間違いなくインストールされているという現状を考えると、これを汎用DBとして使えないかと考えても悪くないよねって話になる。というか、この実装はフルスクラッチなのか、それ…

Windows Installer(MSI)をSQLでたたく

コードがVBScriptなのは、MSDNのサンプルがほとんどそうだったから。既存のMSIにカスタムアクションを追加する程度ならそんなに難しくないはずでしたが、実はかなり面倒でした。この技法が有効なのは、Visual Studio Installerで作成したインストーラに簡単…

Outlook 2007とPreview HandlerとWOW64

Outlook 2007では、Windows Vistaのエクスプローラと同じPreview Handlerが利用できる。ただし、実のところ実装はいろいろと違うらしく、困った事態がいくつかある。 エクスプローラ上でのPreview Handlerは原則、低い整合性で別プロセスとして起動される 昔…

環境変数ではまる

調子に乗って、ActivePerlもx64版なんてものをインストールしてしまい、ここまで書きためていたperlコードが動かなくなって無駄にはまりました。単に、WOW64に対する理解が足りなかっただけなんですけど・・・。 ProgramFiles環境変数 この環境変数ですが、6…

64-bit <-> WOW64へのハンドル値の受け渡し

コマンドライン引数でハンドル値を渡すという愚行以外、特に見るべき部分のないコード。 HANDLE hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); SetHandleInformation(hEvent , HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); TCHAR cmdline[MAX_PATH]; sw…

Windows Vistaで関連付けを変更する

Windowsを長い間使っていたにもかかわらず、最近、「プログラムを指定して開く」が便利すぎてそれしか使っていなかったためか、関連付けを変更する設定はどこでやるのか分からなかった。というか、結局のところ、Vistaでは、関連付けってどうでも良いことに…

perlでNTLM

perlで、LWPを使ってウェブのサイトをさっくりダウンロードなスクリプトを書こうとしていて、サーバーがNTLMで保護されていることに気づく・・・。 で、いろいろと調べたところ、Authen::NTLMというモジュールを発見。ActivePerlだと、Perl Package Manager(…

今更ながらVistaのフォントについて

うち会社のアプリをVistaで動かすと、これまでのデベロッパー全員User権限作戦が功を奏しているだけあって、Vistaで動作しないソフトはほとんどありません。しかしながら、ダイアログのフォントがTahomaなのが微妙に哀愁を誘います。これについて調べてみる…

DLLs Included with Server Core

DLLs Included with Server CoreにWindows Server 2008 Server Coreに含まれるDLLの一覧がある。普段Win32 APIに慣れ親しんでいれば、これで使えるAPI群は何となくわかるはず。意外にもmlangが入っていることに少しだけ安心。うちの会社が作っているアプリ(…