ActiveBasic製ソフトウェア、またはABサイドのソフトウェアを開発された方は、こちらへご紹介ください。関連Webサイトの紹介などもこちへ。
-
山本
- Site Admin
- 記事: 535
- 登録日時: 2005年5月30日(月) 15:08
#1
投稿記事
by 山本 »
api_commdlg.sbp内に定義されている構造体で、本来はアラインメントを必要とするが、特別にアラインメントを無視しなければならない構造体(PRINTDLGなど)が存在します。
例えば、
Print SizeOf(PRINTDLG)
としたときに、本来であれば、アラインメントが適応された68が返るはずのところを、アラインメントを無効にした66が返るという仕様にWin32APIで決められているからです(なんでこうしたんだろ??)。
このような特殊な構造体に対応するため、次回のバージョンアップでAlign修飾子を用意することにしました。書き方は書きの通り。
コード: 全て選択
Type Align(1) PRINTDLG
...
End Type
Alignのあとの括弧の中にアラインメントを何バイト境界でとるのかを強制的に指定します。アラインメントを無効にするときは、1バイト境界にあわせるだけです。
このような書き方は特別な例を除き、ほとんどありませんので、皆さんはあまり気にされなくて大丈夫かと思います。
取り急ぎ、バージョンアップ前のご報告まで。
-
山本
- Site Admin
- 記事: 535
- 登録日時: 2005年5月30日(月) 15:08
#2
投稿記事
by 山本 »
マティ さんが書きました:GDI系の構造体はOS/2 Ver1.?のPM(プレゼンテーションマネージャだったかな?、GUIを管理するシステム)までさかのぼります。
当時のOS/2がターゲットとしていたCPUは286ですので、必然的に構造体のアライメントは2バイト境界となります。
その後、MSとIBMがそれぞれの道を進む事になった際に、Win3.1とOS/2 Ver2へと別々の道を進んでいきます。
GUI系のAPI(名称は別として)は座標の原点が左上か左下の違いしかありませんでした。
Win9x系のディスプレイドライバでGDIを処理するコードは16ビットセグメントで実行します。(DirectX系は32Bitです)
また、WinNT系でもAPIはWin9x系と互換なので過去を引きずっています。(ディスプレイドライバーは32ビット化済みです。)
↑バグ報告板から抜粋
http://www.discoversoft.net/forum/viewt ... =2112#2111
Win32APIってのは、それ自身の設計はかなり古くからあるみたいですね。286の時代ですか、私はいくつだったんでしょう??
VC++をお持ちの方は、のヘッダファイルを見ていただけるとわかりますが、下のような感じでアラインメントの補正が行われています。
コード: 全て選択
#include <pshpack2.h>
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
#include <poppack.h>
pshpack1.h、pshpack2.h、pshpack4.h、pshpack8.hというファイルが存在し、これがABで言うAlign修飾子相当のものになります。poppack.hでデフォルトの状態に復帰します。
ABのapi_gdi.sbpに関しては、VCのwingdi.hのpshpack*.hをチェックしながら補正を行う必要がありますが、今回はBITMAPFILEHEADERの修正だけで間に合うみたいです。