プログラムでも書いてみよう

真面目なプログラムを書く不真面目な男の日記

windows開発Tips

[ リスト | 詳細 ]

記事検索
検索

全1ページ

[1]

タイトルの件について、これを考える上で重要なのはどのプロセスに属するメモリー空間で共有するかと言うことをまず考えないといけない。
たとえば自作ソフトのi-portの場合、explorerの拡張DLLとして実装しておりexplorerは複数立ち上がらない(explorerが不正終了して死にきらない場合などを除く)ためので、仮に複数のDLLで実装しても同一のメモリー空間で動作する。
 
そうではなく、自作のソフトAと自作のソフトBで共有したい場合、別プロセスの場合同然メモリー空間も別なので共有したいデータによって共有方法を検討しなおす必要がある。
 
ざっと思いつく限りでも以下のものが出てくる。
 
1.同一プロセス空間でのデータ共有としてのstatic変数
2.複数プロセス空間でのデータ共有としてEXE形式のCOM
3.複数プロセス空間でのデータ共有としてメモリーマップドファイル
4.複数プロセス空間や複数マシンでのデータ共有として外部データベース
 
当方はVC++6.0を利用しているのでそれを使ってになるが、1と2について簡単に試してみる。
1について、VC++を立ち上げてプロジェクトの新規作成からWin32 Dinamic Link Libraryを作成する。
このとき、シンボルをexportするdllを作成することにより簡単な雛型を作成してくれる。
ソース自体は小さいので一読いただければよいがポイントは__declspec(dllexport),__declspec(dllimport)のdefine文である。
詳細はMSDNを引けば記載があるがようは、DLLとしてコンパイルされる時はコンパイルされる時に「該当DLLの中に変数が定義されますよ」と言う宣言であり、EXEとしてコンパイルされる時は「別DLLにこの変数は定義されますよ」と言う宣言なのである。
 
2については、VC++を立ち上げてATL COM AppWizardを作成する。
このときに実行可能ファイル形式を作成する。
このATL COM AppWizardで公開されるCOMオブジェクトは専用のメモリー空間動作する。
仮にこのCOMEXEをExeAとした場合、外部EXEからCOMオブジェクトが生成されても外部EXEのメモリー空間ではなく新規にExeAが起動されそのメモリー空間でCOMオブジェクトが生成されるのである。
また、別々の外部EXEから起動されたとしても生成されるExeAはひとつだけである。
なので、COMEXE内でStatic変数を定義しておけばそれはCOMオブジェクト内で共有データとして利用できるのである。
 
両者はstatic変数であるため、単純な変数だけでなくclassでも応用が出来る部分にあり外部データベースを検討するほどではなかったり、メモリーマップドファイルのように固定領域にシリアライズするのが難しい場合に気軽に利用できる。
 
但し、これらについて初期化処理・終了処理・排他処理などは別途検討されていなければならない。
 
自作ソフトi-port紹介ページ
http://www.geocities.jp/ys_and_otherjp/index.htm

ちらつき防止

今日から、とりあえず開発時のポイントについていくつか書いてみようと思います。
 
なので、まずは描画処理について
アプリケーションの開発時、アプリケーションのサイズを変更したときやアプリケーション上にウインドウが移動したときに描画がちらつくことがよくあります。
初心者向けの描画サンプルなどではよく見かけますが、初心者のころはマシンスペックが足りないとかいろいろ考えていました。
ですが、以下の点を抑えておけばちらつきは抑える事ができますので参考までに。。。
 
1.描画用のHDCにそのまま書いているのではないですか?
たとえば、HDCに対して黒で塗りつぶして、その後画像を書き込むなどをすると画面に2回書くことになります。
これをメモリー上にHDCをつくりそのHDCに対して描画しメモリー上のHDCを画面に転送すると画面に書き込む回数は1回になります。
これをすることで画面のちらつき防止にかなり効果的です。
Webで"ダブルバッファリング"を検索すると関連情報が出てきますので参考にしてください。
2.WM_ERASEBKGNDに対する処理を実装していますか?
ウインドウサイズが変更されたときや、ウインドウ上に別のウインドウが重なったときなど再描画が発生しますがその前にWindowsは対象のウインドウをすべて消して再描画するようにメッセージを送ります。
すべて消すときのイベントがWM_ERASEBKGNDになりますがデフォルトでは白で消されるため、画面が白くちらつきます。
このメッセージに対する処理を行いましょう。
特に、このメッセージを処理しないで複数のウインドウで親子関係を構築したときなど目も当てられなくなります。
Webで"WM_ERASEBKGND"を検索すると関連情報が出てきますので参考にしてください。
この二つの概念はVC++だけでなく,net Frameworkを使うときも同様です。
 
自作フリーソフト i-port紹介ページ
http://www.geocities.jp/ys_and_otherjp/index.htm

全1ページ

[1]


よしもとブログランキング

もっと見る

[PR]お得情報

いまならもらえる!ウィスパーうすさら
薄いしモレを防ぐ尿ケアパッド
話題の新製品を10,000名様にプレゼント
いまならもらえる!ウィスパーWガード
薄いしモレを防ぐパンティライナー
話題の新製品を10,000名様にプレゼント
コンタクトレンズで遠近両用?
「2WEEKメニコンプレミオ遠近両用」
無料モニター募集中!
ふるさと納税サイト『さとふる』
実質2000円で特産品がお手元に
11/30までキャンペーン実施中!
ふるさと納税サイト『さとふる』
お米、お肉などの好きなお礼品を選べる
毎日人気ランキング更新中!

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事