ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 07:24

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




新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月16日(水) 05:18 
構造体で設定した文字列(STRING)が4.11.00までは直接渡せたのに
StrPtr()でアドレスを渡さなければならなくなったのは
今までが異常だったのでしょうか?。
コード:
With x
CreateFont(-.cFsz,0,0,0,.cFwd,.cFit,.cFul,.cFhl,.cFch,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
.cFpt,.cFna)
End With
.cFpt,StrPtr(.cFna)) 'これで渡される。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月16日(水) 05:31 
追記 :上のコードを下記のように修正すると値を直接渡せる事を書き忘れました。
コード:
Dim FN as String
With x
FN = .cFna
・・・
cFpt,FN)
End With


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月17日(木) 06:38 
STRING以外の値も構造体から取得出来ないか誤った値が返されるようです
よって構造体を使用したソースは動作しないかアクセス違反が出てしまいます。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月17日(木) 14:15 
似た構造体なのにPrintDlg(Pd)は動かないしエラーも出ないが
PageSetupDlg(Ps)は問題なく動く。

管理人さま:4.11.00をうっかり消してしまいダウンロードしようと
思いましたが4.11.01しか落せませんお手数ですがどこかにリンク貼って
もらえませんか?
コード:
Sub MainWnd_CommandButton1_Click()
    Dim Pd as PRINTDLG 
        Pd.lStructSize      =  Len(Pd)
        Pd.hwndOwner        =  hMainWnd
        Pd.Flags            =  PD_RETURNDC
    PrintDlg(Pd)

    Dim Ps as PAGESETUPDLG 
        Ps.lStructSize      =  Len(Ps)
        Ps.hwndOwner        =  hMainWnd
        Ps.Flags            =  PSD_INTHOUSANDTHSOFINCHES
    PageSetupDlg(Ps)
End Sub


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月17日(木) 21:31 
.[2005年11月16日(水) 05:18]の問題は4.11.02で解消されましたが
.[2005年11月17日(木) 14:15]の問題は解決できませんでした。

.なお一部の不具合はキャストを調整すること事で修復できました。

.#strictを指定した場合STRING型を扱うMID$()等で下記の警告が出ますが
問題ないのでしょうか?
(どうもSTRING型やBITE型の周辺で色々と問題が多いので心配です)

1.function.sbp(680) - [警告] *ByteからDWordに強制変換されています。
2.function.sbp(473) - [警告] "memcpy"の第1パラメータが、Stringから VoidPtrに強制変換されています。
3.command.sbp(81) - [警告] LongからHMENUに強制変換されています。
4.command.sbp(86) - [警告] "InsertMenuItem"の第1パラメータが、LongからHMENUに強制変換されています。
5.function.sbp(102) - [警告] Int64からDWordに強制変換されています。データが失われる可能性があります。


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

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
[2005年11月17日(木) 14:15]の問題は、構造体のサイズを計算するLen()に問題があります。
Len(Pd)の値が動作する場合66,動作しない場合68
引用:
Ver4.11.00 2005/11/14の修正で
・オブジェクト・構造体のアラインメントがずれてしまうバグを修正。
この件の修正誤りと思われます。山本様修正をお願いします。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月19日(土) 06:17 
> この件の修正誤りと思われます。山本様修正をお願いします。
ありがとうございます。

 過去ログから以前から指摘されている部分だと理解しましたが4.11.01までは
正常に動作していたので疑問がのこりますし2例とも動作しないならともかく
片方のみと言うのも疑問です。

AB掲示板からの引用です。
投稿時間:2004/06/18(Fri) 16:24
投稿者名:TakeBow/~
Eメール:
URL :http://www.mxm-wk.com
タイトル:PRINTDLG構造体
PrintDlg関数に渡してあげるこの構造体のサイズについてです。
Dim pd As PRINTDLG
Len(pd) の結果は、68です。

この構造体は、Integer型の(2バイト)メンバを5つもっています。
どうも原因はこのあたりにあるようで、過去に問題になった構造体の
パディングのことが頭に浮かんできます。4バイト境界であれば、
2バイトのパディングがあるため、Len関数は68を返してきます。
Len関数は使用メモリ領域の大きさを返す関数ですから、これはこれで
正しい動きと考えてよいのかもしれません。


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

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
原因はご推測の通で、ユーザがローカルで使用する構造体なら問題が無いのですが・・・
APIで使用する構造体は、項目の相対アドレスがアセンブラレベルで一致する必要があります。
(使用メモリ領域が異なるって事は、パラメータの相対アドレスが異なることになります。)

これはVC上でのコンパイル話になりますが、PRINTDLG構造体をVCのヘッダファイル内で定義してsizeof(PRINTDLG)するのと66バイト、独自のソースコード内でPRINTDLG構造体を定義してsizeof(PRINTDLG)したのだと68バイトになります。

性能と互換性のどちらを優先するかは、互換性だと思います・・・
今回のABは、Ver5のノウハウがフィードバックされていると聞いていますので、64BitAPIでは必ずアライメントを取る必要があるのかもしれません。

そういえば、ブロッグの64Bit版開発でアライメントを取らないと落ちる命令があると言っていました。

このへんは山本様に検討していただきましょう。


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

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
次回のバージョンアップで修正するようです。
構造体のアラインメントについて
http://www.discoversoft.net/forum/viewt ... c31bd3bc07


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

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Bing [Bot] & ゲスト[11人]


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

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