2009-01-01から1年間の記事一覧

Visual Studio 2008 のアドインを作成する。まとめ。

今まで何回かに分けてVisual Studio 2008 のアドインを作成するための基礎知識・要素技術を説明してきました。 記事だけだとイメージがわかない部分があるので、ビットマップを用意しました。Visual Studio 2008 のアドインを作成する。アドインの設定。http…

Visual Studio 2008 のアドインを作成する。ドッキングウインドウの作成。

VisualStudio2008のアドインにドッキング可能ウインドウを作成する場合は、EnvDTE80.Windows2.CreateToolWindow2メソッドを使用します。ドッキング可能ウインドウだけだと中身が空っぽの状態になるので、表示するユーザーコントロールを同時に作成します。ユ…

静的リンクと動的リンクまとめ

あるプログラムから別のライブラリを使用する場合のリンク方法ですが、一般的に以下の3つの方法があります。(.NETでは静的リンクは出来ません)■静的リンク ライブラリはコンパイル済みの別のファイルとして存在しますが、コンパイル時にプログラムの中に…

GUIDを作成する。

重複しない一意な識別子(単純なものであれば連番、ランダムなID、MACアドレスなど)を取得したい場合にGUIDを利用する事ができます。GUIDは128ビットのIDで何度GUID取得処理を行っても同じ値が出現しないように設計されていて、時刻やマシン固有の情報(MAC…

32bit OS で、4GByte以上のメモリを搭載する。

32bit OSでは、メモリの搭載上限が4Gbyteと決まっています。ですが、PAE(物理アドレス拡張)を使うと、例えばWindows 2008 Server Enterprise Edition では 64GByteまでのメモリを扱えるようになります。但し、PAEを利用できるのはEnterprise Edition など…

ユーザー インターフェイス特権の分離 (UIPI)と、ウインドウメッセージ(SendMessage,PostMessage,ChangeWindowMessageFilter)

Windows Vista ならびに Windows 2008 からは、セキュリティが強化されたためウインドウメッセージを使用した処理がOSによってフィルタリングされるケースがあります。 この問題は、少しこみいっていてSendMessageやPostMessageはフィルタリングされた場合で…

DLLの参照カウントについて

LoadLibraryとFreeLibraryを使用したDLLの動的ロードは以下の記事で説明しました。http://d.hatena.ne.jp/tekk/20091018/1255880682LoadLibraryとFreeLibraryは、DLLの実行時ロードと解放をそれぞれ担当するAPIですが、呼び出した際にいきなりDLLを読みこん…

DLL(Win32 API など) を実行時に動的ロードする。(LoadLibrary,GetProcAddress,FreeLibrary)

Win32APIを使用する場合はDLLImport属性を付けて使用したいAPIを事前に定義して使います。DllImport属性は使用したいDLLとのリンクがコンパイル時に設定されるためアプリ起動時にリンクを解決しようとします。(リンクを解決するというのは、DLLをメモリ上に…

Win32 API のエラー情報を取得する

Win32 APIを実行したあとでエラー情報を取得するには次の2段階の処理を経て取得します。(Win32APIは失敗しても例外は発生しません)1.Marshal.GetHRForLastWin32Errorでエラー情報のHRESULT値を取得します。 2.Marshal.GetExceptionForHRでHRESULT値から例…

sitemap.xmlの作り方

検索エンジン用のsitemap.xmlの実装例です。指定したフォルダ以下にアップロードするファイル一式が揃っている状態で使用します。携帯電話向けのsitemap.xmlも出力することができます。 Imports System Imports System.Xml Imports System.TextPublic Class …

ウインドウメッセージによるプロセス間通信(WM_COPYDATA)

WM_COPYDATAメッセージを利用したプロセス間通信処理を作成する。WM_COPYDATAはプロセス間通信を目的としたウインドウメッセージで任意のサイズのデータをグローバルヒープメモリを通して別プロセスに伝えることができる。使用に当たっては、以下の課題を整…

ウインドウメッセージのリフティング処理(PostMessageの隠れた使い方)

ウインドウアプリケーションでは、ウインドウそれぞれがメッセージキューを持っていて順番にメッセージを処理します。処理が終わるまでは、次のメッセージは処理されません。この特性を利用して、処理のタイミングを調整するプログラミングテクニックをウイ…

SendMessageとPostMessageの違い

SendMessage メッセージを転送先のウインドウのウインドウプロシージャに直接送信します。処理は同期で、転送先のウインドウプロシージャがメッセージを処理し終えるまでは呼び出し元の処理はブロックされます。 PostMessage メッセージを転送先のウインドウ…

リモートデスクトップを使って、物理コンソールに接続する

リモートデスクトップを使用するとユーザ毎に新しくログオンセッションが開始されますが、以下のコマンドを実行すると物理的なキーボードやマウスが接続されているコンソールセッションとして接続することができます。コマンドラインから以下を実行します。 …

BinaryFormatterを使用してインスタンスをバイナリでシリアライズする。

.Netのシリアライズで最も早く最も効率的なシリアライズはBinaryFormatterを使用したバイナリでのシリアライズです。.Net Remoting などの内部通信形式としても使用されているシリアライズです。XMLシリアライズできないケースに対応するで紹介したシリアラ…

オブジェクトのコピー。ICloneableインタフェース、MemberWiseClone、シリアライズを利用したインスタンスのコピー。

オブジェクトをコピーするためにはMemberwiseCloneメソッドを使用します。MemberwiseCloneメソッドは、シャローコピー(浅いコピー)と呼ばれるコピーで値型のメンバーをコピーして新しいインスタンスを作成する方法です。参照型のメンバーに関しては、参照…

XMLシリアライズできないケースに対応する。DBNull.Valueに対応する。

アトリビュートを付けているクラスであればシリアライズすることができます。ですが、インスタンスによっては失敗するケースがあります。■Object変数にDBNull.Valueを含む場合 System.InvalidOperationException が発生しました。 Message="XML ドキュメント…

ネットワークの基礎とUNIXネットワークプログラミング

東京大学大学院 情報理工学系研究科 数理情報学第2研究室 土村 展之さんのページ http://www.misojiro.t.u-tokyo.ac.jp/~tutimura/ソフトウェア開発実践セミナーの各スライドの説明は丁寧でポイントが押さえてあって勉強になります。 ネットワークプログラ…

Visual Studio 2008 のメモリ消費量が異常な場合

Visual Studio 2008 のメモリ使用量が通常時の2.5倍以上(500MByte以上)となっていたケースがあった。 原因をしらべてみると、.slnファイルとともにある.suoファイルが肥大化していることが分かった。対処としては、.suoファイルを削除することでメモリ…

XMLシリアライズできないケースに対応する。DataTableに対応する。

アトリビュートを付与しているインスタンスであればシリアライズできるが、インスタンスによっては失敗するケースがある。■TableNameなしDataTable System.InvalidOperationException はハンドルされませんでした。 Message="XML ドキュメントを生成中にエラ…

XMLシリアライズできないケースに対応する。循環参照に対応する。

アトリビュートを付与しているインスタンスであればシリアライズできるが、インスタンスによっては失敗するケースがある。■循環参照 System.InvalidOperationException はハンドルされませんでした。 Message="XML ドキュメントを生成中にエラーが発生しまし…

Visual Studio 2008 のアドインを作成する。アドインの構成。

VisualStudio2008のアドインは、アドインとIDEとのインタフェースに次の2つのインタフェースを使用します。 IDTExtensibility2(IDEとの接続用インタフェース) IDTCommandTarget(コマンドボタンが押された際に通知するインタフェース) そのため、.Addinフ…

Visual Studio 2008 のアドインを作成する。アドインの設定。

VisualStudio 2008 のアドインはDLL形式で提供されますが、VisualStudio 2008が起動時にアドインDLLを読み込めるように以下の設定を行う必要があります。VisualStudio2008は起動時に、MyDocumentのVisualStudio2008フォルダにあるAddinsフォルダ(アドインが…

VisualStudio 2008 の起動を高速化する

ファイルメニューから[ツール(T)]-[オプション(O)]でオプション画面を表示し、「環境」-「スタートアップ」の設定で以下を設定する。 (この際、オプション画面の左下の[すべての設定を表示(A)]をチェックをつける)・スタートアップ時 空の環境の表示 ・コ…

アトリビュートを指定してXMLのシリアライズに対応したクラスを作成する。1要素に値と属性を持つ場合。(XmlTextAttribute)

C#

XMLシリアライズは、クラスのメンバに1対1でXMLの要素や属性が対応します。ですが、以下のようなname要素に属性(japan)と値(taro kobe)を持つXMLの場合は、2つ以上のメンバをXMLの1要素として対応付けさせる必要があります。 taro kobe manager この…

Visual Source Safe (VSS) と Visual Studio のバインドを解除する

VSS 管理下にあるプロジェクトをVSSに接続できない環境に持っていく、自動ビルドやバッチでの静的解析の際にバインド情報が残存しているとバッチ処理に失敗するなど、VSSのバインド情報を削除する必要があります。今回は、VSSのバインド情報が、どのように構…

DLLの読み込み。DLLを探す検索パスの順序を変更する。(probing path によるサブディレクトリ、DLL/COMリダイレクション、Registration-Free ActiveX)

DLLの読み込み場所を、既定の場所以外から読み込むには以下の方法がある。・サブディレクトリからDLLを読み込む(.Netのみ) アプリケーション構成ファイル(application.exe.config)を使用してプロービングパスの設定を行う。以下の設定を行うとアプリケー…

DLLの読み込み。DLLを探す検索パスの順序。(System32、GAC、カレントディレクトリ、レジストリ、環境変数PATH)

読み込み場所についてのまとめ。■Win32 API 系 stdCall,cdecCall・System32 ・カレントディレクトリ ・環境変数PATHが通っているディレクトリ■ActiveX,Com・レジストリに登録された場所 RegSvr32, registerserver■.Net・レジストリに登録された場所(GAC) ・…

1分ごとにタスクを実行する(schtasksコマンド)

Windowsのタスクは画面から設定すると時間ごとにしか処理を設定できないように見えますが、コマンドラインからschtasksコマンドを使って設定することで、WindowsでもUnixのcronのように1分単位でタスクスケジュールを設定することができます。参考:c:\test.…

xsdによるクラスの自動生成。自動生成で対応できないクラスを調整する。(2次元配列のメンバー)

C#

xsdツールで自動生成したクラスをXMLSerializerで読み込もうとした場合に例外が発生するケースがあります。これはXSDが対応できていないタイプのXMLです。 Message="一時クラスを生成できません (result=1)。\r\nerror CS0030: 型 'XMLAttributeTest.Company…