StrPtr()で渡さなければ動作しなくなった。

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
Uhsp

StrPtr()で渡さなければ動作しなくなった。

#1 投稿記事 by Uhsp »

構造体で設定した文字列(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)) 'これで渡される。
Uhsp

#2 投稿記事 by Uhsp »

追記 :上のコードを下記のように修正すると値を直接渡せる事を書き忘れました。

コード: 全て選択


Dim FN as String
With x
FN = .cFna
・・・
cFpt,FN)
End With
Uhsp

#3 投稿記事 by Uhsp »

STRING以外の値も構造体から取得出来ないか誤った値が返されるようです
よって構造体を使用したソースは動作しないかアクセス違反が出てしまいます。
Uhsp

#4 投稿記事 by Uhsp »

似た構造体なのに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
Uhsp

#5 投稿記事 by Uhsp »

.[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に強制変換されています。データが失われる可能性があります。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#6 投稿記事 by マティ »

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

#7 投稿記事 by Uhsp »

> この件の修正誤りと思われます。山本様修正をお願いします。
ありがとうございます。

 過去ログから以前から指摘されている部分だと理解しましたが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関数は使用メモリ領域の大きさを返す関数ですから、これはこれで
正しい動きと考えてよいのかもしれません。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#8 投稿記事 by マティ »

原因はご推測の通で、ユーザがローカルで使用する構造体なら問題が無いのですが・・・
APIで使用する構造体は、項目の相対アドレスがアセンブラレベルで一致する必要があります。
(使用メモリ領域が異なるって事は、パラメータの相対アドレスが異なることになります。)

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

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

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

このへんは山本様に検討していただきましょう。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#9 投稿記事 by マティ »

次回のバージョンアップで修正するようです。
構造体のアラインメントについて
http://www.discoversoft.net/forum/viewt ... c31bd3bc07
返信する