2008年2月22日 (金)

Officeのフォーマットが公開されている

何かとオープンな時代。

先日、Officeのバイナリフォーマット仕様が公開されました。

http://www.microsoft.com/interop/docs/officebinaryformats.mspx

えっと ・・・ 今更だよね!?

08:41 午後 WindowsDev | | コメント (2) | トラックバック (0)

2007年4月24日 (火)

C++で作成したDLLを他の言語で利用できるようにする

C++でDLLを作成していざVisual Basicから呼ぼうとすると関数が呼べない。

そんな問題を解決した経験があるならば、関数の装飾名呼び出し規約についてご存じでしょう。実は、1年ほど前に同等の記事を長々と書きましたが、重要な部分だけを再びおさらい、ちょっと補足。

意味もなくDEFファイルを作っている人は理解が足りないかもしれません。

続きを読む "C++で作成したDLLを他の言語で利用できるようにする"

10:55 午後 WindowsDev | | コメント (0) | トラックバック (0)

2007年3月10日 (土)

DOSプロンプトは&で命令を繋げられる

タイトルの通りですが、DOSプロンプトでは「」を使って命令を繋げることが出来ます。

簡単な例では

> cd windows & dir

とするとwindowsという名前のディレクトリに移動した後、dirコマンドを実行します。
此処までは分かっていたのですが・・・

続きを読む "DOSプロンプトは&で命令を繋げられる"

01:13 午前 WindowsDev | | コメント (2) | トラックバック (0)

2007年2月17日 (土)

Visual Studio 2005にサービスパックを当てると、Cランタイムがアップデートされる

サービスパックを当てると、自分の作ったアプリケーションが他の環境で動作しなくなります。最近ハマりました。(5分で解決したけど)

何故、動作しないかというと、C++のランタイムのバージョンが微妙に上がっているからです。

続きを読む "Visual Studio 2005にサービスパックを当てると、Cランタイムがアップデートされる"

07:41 午後 WindowsDev | | コメント (0) | トラックバック (0)

プログラムの実行時間を計測する

Windowsでプログラムの実行時間を計るのは簡単ではありません。他のスレッドが計測の邪魔をするからです。

最初に確認しなくてはならない事は、実行時間を計測するために、ソースコードを修正できるか否かです。

前者の場合は、Kernrateパフォーマンスカウンタを使うのが一般的です。
ここでは後者の状況について詳しく検討していきます。

続きを読む "プログラムの実行時間を計測する"

07:26 午後 WindowsDev | | コメント (0) | トラックバック (0)

2007年1月19日 (金)

.manifest?.local?.config?

最近のVisual Studioで開発を行うと勝手にできてしまうんです、とか言われました。

これらは全て、アプリケーションが使うDLLの選定に関係しますので覚えてください。

以下、解説していきますが、答えを見るまえに自分で考えてみてください。

続きを読む ".manifest?.local?.config?"

10:21 午後 WindowsDev | | コメント (2) | トラックバック (0)

2006年11月17日 (金)

DLL単体からLIBを作る

LIBが欲しいんだけど、DLLしかないと言われました。そんなとき、貴方ならどうしますか?

  • Win32APIで提供されているLoadLibrary、GetProcAddressを使えと説得する
  • LIBファイルを自力で作る

ここでは、後者の方法について紹介します。

続きを読む "DLL単体からLIBを作る"

11:05 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年11月 9日 (木)

.NET Framework 3.0が利用可能に

今日気づいたのですが、.NET Framework 3.0が出たようです。

ダウンロード先は以下の通り。

いつものごとく、SDKにはランタイムが含まれないため、開発者は両方ダウンロードする必要があります。

続きを読む ".NET Framework 3.0が利用可能に"

12:00 午前 WindowsDev | | コメント (0) | トラックバック (1)

2006年10月14日 (土)

Windowsアプリエラー終了時の動作を制御する

Windowsではアプリケーションが落ちるときに妙なダイアログを出します。この情報は開発者にとって有益でも、一般人にとっては邪魔なだけです。そもそも、アプリケーションのスタックダンプなんてMSのサーバに送ってしまったら、情報漏洩にもつながりかねません。

そこで制御しようとした所、出るダイアログの種類が意外と多いことに気づきました。そこで制御方法について纏めておきます。

続きを読む "Windowsアプリエラー終了時の動作を制御する"

12:48 午前 WindowsDev | | コメント (0) | トラックバック (0)

2006年9月 9日 (土)

Visual Studio .NET 2003のSP1が公開されていた

私はすっかり見落としていたのですが、Visual Studio .NET 2003 サービスパック1が公開されていました。

詳細はKB918007リリースノートを参照。

ちなみに、ブラウザのTOPページをMSDNにしているのに気づきませんでした。ダウンロード情報に書く内容は絞って欲しいと思います。

続きを読む "Visual Studio .NET 2003のSP1が公開されていた"

12:06 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年8月 6日 (日)

VC++の開発に於いてSALを使う

SALとはStandard Annotation Languageの略で、現時点では、WindowsAPIの関数呼び出しの記述に使われています。

SALという言葉は知らなくてもこのようなヘッダを見たことはあるのではないでしょうか?

StringCchCopyA(
    __out_ecount(cchDest) STRSAFE_LPSTR pszDest,
    __in size_t cchDest,
    __in STRSAFE_LPCSTR(※1) pszSrc

);

赤字の部分がSALであり、VC++でコンパイルした場合、バッファオーバーフローを検出したりする事が出来ます。

続きを読む "VC++の開発に於いてSALを使う"

09:26 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年7月30日 (日)

偽装(Impersonate)時の注意点

偽装を乱暴に説明すると、スレッドがユーザになりすます仕組みです。Windowsではスレッドを1つ作成し、権限を落としたトークンを割り当てる事により、セキュリティを確保することができ、アプリケーションサーバなどで良く利用されます。

しかし、偽装(Impersonate)時のユーザ情報の参照には気をつける必要があります。何故なら偽装中のユーザ情報ではなく、別のユーザの情報にアクセスしてしまう可能性があるからです。

続きを読む "偽装(Impersonate)時の注意点 "

07:07 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年7月11日 (火)

開発リソースリンク集

開発者は少なからず自分の贔屓サイトを持っていると思います。

今回は私が使っているサイトの中からWindows開発に役に立つリンクを集めてみました。

続きを読む "開発リソースリンク集"

01:50 午前 WindowsDev | | コメント (0) | トラックバック (0)

2006年6月20日 (火)

よりセキュアに数字と文字列を扱う

文字列や数字を正しく扱うのが難しいということは認知されているようですが、実際に正しく使えている人は意外と少ないものです。

Windowsシェル関数(IEと共にアップデートされる)の中にはStrSafeIntSafeというAPI群が存在するため、誰でも簡単にセキュアなプログラムが作成できます。

続きを読む "よりセキュアに数字と文字列を扱う"

11:29 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年6月 9日 (金)

MSDN Libraryが一般公開されている?

Microsoft社のページを眺めていたらMSDN Libraryへのダウンロードリンクがあったので調べてみました。

どうやら2005の更新用パッケージらしいですが、サイズからすると普通に全て入っていそうな雰囲気。配布先はダウンロードセンターで、「MSDN ライブラリ 2006年6月版」と検索すれば出てきます。ちなみに直リンクはこちら

Visual C++もExpressで十分だし、ドキュメントも定期的にアップデートされるならば、もうMSDNの会員になる必要がない気がします・・・。

06:14 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年5月24日 (水)

開発に欠かせないツール(ネイティブアプリ編)

開発の際にツールを使うとかなり効率がアップするわけですが、地道にデバッカを睨んでいるだけの人が多いのには驚かされます。

そんな訳でお勧め出来るフリーのツールを紹介します。

続きを読む "開発に欠かせないツール(ネイティブアプリ編)"

02:01 午前 WindowsDev | | コメント (3) | トラックバック (0)

2006年5月10日 (水)

Visual C++のメモリ確保関数

以前、Windowsのメモリ確保関数について使い分けを書きましたが、今回はもう少しVisual C++寄りに説明します。

mallocやnewが割り当てる最小単位が何バイト程か考えた事がありますか?

考えた事が全くない場合、貴方のアプリケーションは速度において大きく損している可能性があります。

続きを読む "Visual C++のメモリ確保関数"

11:56 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年4月30日 (日)

マルチスレッドにする理由

Windowsにおいてマルチスレッドにする理由は何でしょうか?

並列処理による高速化をすれば~等と言う人も多いですが、私の経験則からして大抵の人は良く理解せずに発言しているようです。Windows開発における超基礎をおさらいします。

続きを読む "マルチスレッドにする理由"

02:57 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年4月 9日 (日)

アセンブリの関数をCOMとして公開する

.NET FrameworkはCOMの発展系として作られたので、通常の関数をCOMの関数であるかのように公開できます。公開の方法は言語によって異なりますが、COMVisibleAttributeという属性を利用すると簡単にできます。

作成したDLLは.NET Framework付属のREGASMコマンドを利用してCOMとして登録し、Visaul C++ 6.0等の古いアプリケーションで利用することが出来ます(当然実行環境に.NETのランタイムは必要)。

例えばVC++では以下の通り。

続きを読む "アセンブリの関数をCOMとして公開する"

11:04 午前 WindowsDev | | コメント (0) | トラックバック (0)

2006年4月 2日 (日)

サポートするWindowsのバージョンを明確にする

基礎的な事ですが、Visual C++やPlatform SDKに含まれるヘッダはマクロ定義によって内容が変化します。これは開発したプログラムが動作するWindowsを限定するのに利用します。

その目的で指定出来るのは以下の4つです。

  • WINVER (全てのWindowsを対象とした通し番号)
  • _WIN32_WINNT (WinNT4.0, 2000, 2003)
  • _WIN32_WINDOWS (Win95, 98, ME)
  • _WIN32_IE (Internet Explorerに付随したシェル拡張)

続きを読む "サポートするWindowsのバージョンを明確にする"

12:53 午前 WindowsDev | | コメント (0) | トラックバック (0)

2006年3月25日 (土)

Platform SDKがUpdateされていた

気づくのが大分遅れましたが、2006/3/14にPlatform SDKがUpdateされていました。

バージョンがWindows Server 2003 R2と書かれていますが、一部APIを除き過去のOSでも動作しますし、ちゃんとサポート対象に含まれています。

Windows APIの不具合が修正されていたり、新機能が増えていますので、開発者は常に最新のものを確認しておく必要があるでしょう。

続きを読む "Platform SDKがUpdateされていた"

10:56 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年3月10日 (金)

時間関数の分解能を実測してみた

先日、時間を計測する関数を列挙し、精度を目安として挙げました。
しかし、結局は自分で測ってみたいでしょうからさくっと作成してみました。

ソースはこちら
バイナリでも良い人はこちら

コンパイルにはVisual C++ .NET 2003が必要です。
実行には勇気が必要です。(※運悪いとハングアップする)

続きを読む "時間関数の分解能を実測してみた"

10:09 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年3月 9日 (木)

時間を計測する関数

Windowsで時間を計測する場合、関数が沢山あって迷ってしまうらしいです。

そこで私が使う関数を精度順にならべてみました。

  • QueryPerformanceCounter(パフォーマンスカウンタ)
  • timeGetTime(マルチメディアタイマ)
  • GetTickCount(標準タイマ)
  • clock ≒ GetSystemTimeAsFileTime(C言語標準)

分解能が高いと他プロセスに与える負荷が増えるため、用途に応じて精度ギリギリの関数を選択すると良いと思います。

続きを読む "時間を計測する関数"

12:32 午前 WindowsDev | | コメント (0) | トラックバック (0)

2006年3月 6日 (月)

HeapAllocとVirtualAllocの使いどころ

最適化の為にはメモリの確保方法は工夫しなければならないと以前の記事にしましたが、Windowsプログラミングにおける工夫の1つをご紹介します。

Windowsにはメモリ確保の関数が多いですが、最低限以下の4つは特性を理解して使うべきです。

  • HeapAlloc
  • VituralAlloc
  • LocalAlloc/GlobalAlloc
  • new (malloc)

続きを読む "HeapAllocとVirtualAllocの使いどころ"

01:17 午前 WindowsDev | | コメント (0) | トラックバック (0)

2006年2月23日 (木)

MSVCR80.DLLは.NET Framework2.0に付属している

Visual C++ 2005のCランタイムであるMSVCR80.DLLが無いためアプリケーションが起動出来ない場合があります。(サービスパックを当てた方はこちらも参照

その場合、Microsoft Visual C++ 2005 再頒布可能パッケージ(x86)を導入するのが最も簡単です。

この問題は「.NET Framework 2.0 Redistributable Package(再配布可能パッケージ)」を導入すると解決します。一緒にC++のランタイムであるMSVCP80.DLLもインストールされます。(いつの間にか同梱されなくなったようです)

# 最新のVC8ではSideBySideを考慮しているため、今までのように簡単な配布が出来なくなりました。コピーして動くというものではありません。使用するためには、EXEファイルのリソース、または外部ファイルとしてマニフェストを使う必要があります。

続きを読む "MSVCR80.DLLは.NET Framework2.0に付属している"

12:51 午前 WindowsDev | | コメント (2) | トラックバック (0)

2006年2月18日 (土)

不要なFreeLibraryは避けよ

最近、同じプロセス内で何度も使うような関数を何度もFreeLibraryしている例を見ました。その遅さは見るに堪えないものでした。

LoadLibraryした後に決定される関数のアドレス(GetProcAddress)は、FreeLibraryしない限り、プロセス終了時まで変化することがありません。

続きを読む "不要なFreeLibraryは避けよ"

03:52 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年2月11日 (土)

DllImportを理解する

DLLを作る事は出来るのに、Importテーブルについて知らない人は結構います。Importテーブルとは、他のDLLの関数を高速に呼び出す為のインデックスです。

続きを読む "DllImportを理解する"

08:06 午後 WindowsDev | | コメント (0) | トラックバック (0)

2006年1月 6日 (金)

Cランタイムは動的にリンクすべきだ

EXEにCランタイム(以下CRT)の関数を埋め込むのは良くないです。
動的にリンクしたい場合、Visual C++では「/MD」スイッチを利用します。

理由は以下のとおり。

・複数のCRTが同時に読み込まれるのを避ける

異なるバージョンのCRTは情報を共有しません。複数初期化されたり、環境変数を設定しても一部にしか反映されなかったりします。メモリの開放をするどころか、ファイルポインタの共有すら出来ません。

続きを読む "Cランタイムは動的にリンクすべきだ"

01:18 午前 WindowsDev | | コメント (0) | トラックバック (0)

2005年12月16日 (金)

LoadLibraryが正常に動作しない場合が存在する

DLLに対して常にLoadLibraryが可能であるとは限りません。遅延読み込みしたDLLについても同様の事が言えます。

続きを読む "LoadLibraryが正常に動作しない場合が存在する"

09:26 午後 WindowsDev | | コメント (0) | トラックバック (0)