ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 08:41

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - 構造体のアラインメントについて
作成者 メッセージ
  記事の件名:   引用付きで返信する
引用:
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の修正だけで間に合うみたいです。
投稿記事 Posted: 2005年11月24日(木) 14:09
  記事の件名:  構造体のアラインメントについて  引用付きで返信する
api_commdlg.sbp内に定義されている構造体で、本来はアラインメントを必要とするが、特別にアラインメントを無視しなければならない構造体(PRINTDLGなど)が存在します。

例えば、
Print SizeOf(PRINTDLG)
としたときに、本来であれば、アラインメントが適応された68が返るはずのところを、アラインメントを無効にした66が返るという仕様にWin32APIで決められているからです(なんでこうしたんだろ??)。

このような特殊な構造体に対応するため、次回のバージョンアップでAlign修飾子を用意することにしました。書き方は書きの通り。
コード:
Type Align(1) PRINTDLG
	...
End Type
Alignのあとの括弧の中にアラインメントを何バイト境界でとるのかを強制的に指定します。アラインメントを無効にするときは、1バイト境界にあわせるだけです。


このような書き方は特別な例を除き、ほとんどありませんので、皆さんはあまり気にされなくて大丈夫かと思います。

取り急ぎ、バージョンアップ前のご報告まで。
投稿記事 Posted: 2005年11月20日(日) 19:32

全ての表示時間は UTC+09:00 です


ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean