ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月25日(土) 08:51

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月20日(日) 19:32 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
api_commdlg.sbp内に定義されている構造体で、本来はアラインメントを必要とするが、特別にアラインメントを無視しなければならない構造体(PRINTDLGなど)が存在します。

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

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


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

取り急ぎ、バージョンアップ前のご報告まで。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 14:09 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
引用:
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の修正だけで間に合うみたいです。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 2 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke