No.4ベストアンサー
- 回答日時:
API関数をバージョンアップ出来るようにする為です。
例えば、最初のバージョンで、ある構造体のサイズが50バイトにしたとします。
このAPI関数を呼ぶ場合、どのアプリもcbSizeに50を入れて呼びます。
ある時、API関数に機能が追加され、構造体の中身がソックリ入れ替わり、70バイトになったとします。
古いアプリは、API関数が古いままのつもりで、cbSizeに50を入れて呼びます。
新しいアプリは、API関数が新しくなったつもりで、cbSizeに70を入れて呼びます。
ここで、新しいAPI関数は「古いアプリもサポートする必要がある」ので、cbSizeが50で呼ばれたら古いバージョンと同じ動きをして、cbSizeが70で呼ばれたら追加機能がある新しいバージョンでの動きをします。
このようにすれば「API関数に機能追加をしつつ、古いアプリもサポートできる」ようになります。
なお、API関数が追加機能の無い古いバージョンのまま、追加機能を利用したアプリを走らせて、そのアプリが「API関数が新しいバージョンになっているつもりでAPI関数を呼ぶ」と、古いAPI関数は「cbSizeが不正ですよ~」と言うエラーコードを返します。
アプリは、このエラーコードを見て「このバージョンのWindowsでは実行できません」などのエラー表示を行う事になります。
なお、API関数のバージョンが変わると「構造体の後ろに新しいデータが追加され、前の方は古いバージョンと同じになっている事が多い」ですが、そうとも限りません。
場合によっては「特定の数値変数のサイズが2から4に変わった」とか「特定の数値変数のサイズが4から8に変わった」などで、途中からズレてたり、中身がまるっきり違うなんて事もあります。
まとめると「cbSizeは、呼び出し元のアプリが、どのバージョンのAPI関数を呼んだつもりになっているかを、API関数に知らせる為の物」です。
なお「元からバージョンは1つしかなく、機能追加の予定もなく、今も機能は1つしかない」としても「将来、変わるかもしれない」ので「cbSizeでバージョン判定」が行われているAPI関数が多数あります。
この回答へのお礼
お礼日時:2009/03/23 22:14
まずは、返答遅れてしまい、申し訳ありませんでした。
丁寧な解説ありがとうございます。なるほど。
dllのインターフェイスに当たる関数のアドレスが変わらない事を
利用した上手いバージョンアップの方法ですね。面白い。
No.3
- 回答日時:
No.2
- 回答日時:
#1の方のお書きの通りだと思いますが、もう少し違う言い方をすると、
「APIの機能アップをしたいのだが、今の引数構造体だと、新機能の細かい指定をする項目のエリアがない」というような事が起こると困るので、そういう場合に、「構造体の後ろに新項目を継ぎ足して、サイズをその分増やす」という方式を採っているわけです。
No.1
- 回答日時:
こんばんは。
此れに関して確証が無いのですが、私が読んだ書籍の中には、「指定された構造体のサイズで、windowsやdllのバージョンを判断して挙動を変える」と言った事が書いてありました。
実際に良く出てくるwindowsビットマップ用の構造体でも、そんな感じの使われ方をされています(必ずこういった使い方であるかどうかは不明です)。
http://ja.wikipedia.org/wiki/Windows_bitmap
DWORD biSize;//ファイルの先頭からsizeof(BITMAPFILEHEADER)分下がった位置でsizeof(DWORD)分読み込む
switch(biSize)
{
case sizeof(BITMAPINFOHEADER):
//windowsビットマップの多くは此れ
break;
case sizeof(BITMAPCOREHEADER):
//os/2
break;
case sizeof(BITMAPV4HEADER):
//win95, nt4.0
break;
case sizeof(BITMAPV5HEADER):
//win98, win2000
break;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語 2 2022/07/21 00:02
- 哲学 説得力を修辞の巧みさまたは論理の強さの2つに分析するにはどうすると良いでしょうか? 0 2022/07/20 05:46
- 哲学 非構造主義 1 2023/04/06 16:02
- 一戸建て 準耐火構造で、かつ透湿性のある【壁の構造】について質問させてください。 現在、東京都の風致地区で、高 1 2023/07/22 02:56
- その他(プログラミング・Web制作) Pythonのデータ型 2 2023/04/26 12:53
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- バイク車検・修理・メンテナンス バイク 車検 名義変更 構造変更について。 親から一時抹消されていない、400cc車検切れのバイクを 1 2023/04/22 18:31
- その他(悩み相談・人生相談) フェミニストの言う男女の平等の終着点ってどこだと思いますか?また、どこですか? 1.手当や評価、権利 2 2022/12/20 20:20
- 工学 西洋の教会の鐘で巨大な鐘を揺らして鳴らすのは、物理的にどんなメリットがあるの? 9 2022/12/13 08:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
chromedriverのDLについて
-
JRE 1.5.0.14のダウンロード先...
-
Tmocatのバージョン
-
ez-htmlで文字化けしてしまいま...
-
EclipseでJavaコンパイラのバー...
-
reactを利用できるnode.jsのバ...
-
XCODE コンソールのクリア
-
URLDownloadToFileのコピペで64...
-
gitでバージョン指定してダウン...
-
javacとjavaのバージョン違い
-
MSCOMCTL.OCXのアップデートの方法
-
VBランタイムの種類って・・・...
-
Selenium/VBA/Chrome エラーで...
-
【javaコンパイル時のエラーに...
-
ロールバックの逆の言葉は?
-
gridviewでの高さの取得方法
-
パワーポイントをインストール...
-
しばしばバージョン表記に現れ...
-
CrystalReportsのバージョン確...
-
VB.NETですがバージョンが高い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gitでバージョン指定してダウン...
-
使用しているJUnitのバージョン...
-
CrystalReportsのバージョン確...
-
EclipseでJavaコンパイラのバー...
-
visual stadio 参照問題
-
バイナリファイルの著作権など...
-
VMwareの古いバージョンがダウ...
-
VBAでDVDのトレイを開く。、
-
Selenium/VBA/Chrome エラーで...
-
【javaコンパイル時のエラーに...
-
MSCOMCTL.OCXのアップデートの方法
-
Javaのバージョンアップにとも...
-
chromedriverのDLについて
-
JRE 1.5.0.14のダウンロード先...
-
gridviewでの高さの取得方法
-
C# Excelを遅延バインディング...
-
Tmocatのバージョン
-
Flashplayerの運用について
-
エクセルVBAがMACで動かない
-
reactを利用できるnode.jsのバ...
おすすめ情報