ab.com コミュニティ https://www.activebasic.com/forum/ |
|
構造体のアラインメントについて https://www.activebasic.com/forum/viewtopic.php?t=477 |
ページ 1 / 1 |
作成者: | 山本 [ 2005年11月20日(日) 19:32 ] |
記事の件名: | 構造体のアラインメントについて |
api_commdlg.sbp内に定義されている構造体で、本来はアラインメントを必要とするが、特別にアラインメントを無視しなければならない構造体(PRINTDLGなど)が存在します。 例えば、 Print SizeOf(PRINTDLG) としたときに、本来であれば、アラインメントが適応された68が返るはずのところを、アラインメントを無効にした66が返るという仕様にWin32APIで決められているからです(なんでこうしたんだろ??)。 このような特殊な構造体に対応するため、次回のバージョンアップでAlign修飾子を用意することにしました。書き方は書きの通り。 コード: Type Align(1) PRINTDLG ... End TypeAlignのあとの括弧の中にアラインメントを何バイト境界でとるのかを強制的に指定します。アラインメントを無効にするときは、1バイト境界にあわせるだけです。 このような書き方は特別な例を除き、ほとんどありませんので、皆さんはあまり気にされなくて大丈夫かと思います。 取り急ぎ、バージョンアップ前のご報告まで。 |
作成者: | 山本 [ 2005年11月24日(木) 14:09 ] |
記事の件名: | |
引用: 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の修正だけで間に合うみたいです。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |