ホームページ開発ツール>64bit対応について

64bit対応について


 以下は、原則としてXojo 2016 Release 3を対象としています(注:各バージョンごとのトピックを除く)。また、内容は本コラム内で扱っている話題に関するものです。
 一般論としての64bit対応については、公式ドキュメントをご覧下さい。
     UserGuide:64-Bit Guidelines - Xojo Documentation

<Xojoネイティブ>
 Xojoネイティブ機能に関する記事については、特に32bit/64bitを意識しなくても大丈夫なようです。

<CocoaのDeclare>
 浮動小数点の型
 SingleをDoubleに変更します。
 なお、32bitと64bitの両方に対応したい場合は、CGFloatにすると、Xojo側でビルド時に最適な型を割り付けてくれます。
<追記>
 一部のAPIでは、アップルのドキュメントにfloatと記されていても、SingleではなくDoubleにしないと動作しない場合があるようです。

 MemoryBlock
 SingleValueはDoubleValueに、Int32ValueはInt64Valueに変更します(UInt系も同様)。この時、確保するサイズやオフセットも同期させます。
 32bitと64bitの両方に対応したい場合は、Target32bitやTarget64bitを使って条件分岐するしかないようです。(他にいい方法があれば、教えて下さい。)

 Variant
 SingleValueはDoubleValueに、IntegerValueまたはInt32ValueはInt64Valueに変更します(UInt系も同様)。
 32bitと64bitの両方に対応したい場合は、Target32bitやTarget64bitを使って条件分岐するしかないようです。(他にいい方法があれば、教えて下さい。)

 符号付き整数型
 32bitで書き出した符号付き整数を64bitで読み込むと、値がマイナスである場合に、符号拡張が行われない場合があるようです。
(例えば、NSMutableArrayにnumberWithIntegerでセットしてintValueで取り出す場合。回避方法があるのかもしれないが、詳細は未調査。ちなみに左記の場合は、一度Int32型の変数で受けた後、Integer型に代入すれば符号拡張されます。)

 long型
 以下を参照。
 【C言語/C++】データ型のサイズ・範囲の一覧【32bit/64bit環境】 | MaryCore

 LibraryName
 32bitでは問題ないものが、64bitではリンクエラー(下記CarbonのDeclareスクリーンショットと同じメッセージ)になる場合があります。
 この場合、LibraryNameを変えるとエラーが解消されることがあります。
(対症療法レベルの対応です。本来はヘッダーを調べるなどして厳密に対処すべきでしょうが、そこまではできていません。)
 この場合、LibraryNameを変えたり、Xojoのバージョンを上げたりするとエラーが解消されることがあります。
 理由はよく分かりませんが、以下のケースのような状況が内部的に発生しているのかもしれません。
 [XCode][Cocoapods]ビルドエラー時の対処法 - Qiita

<Cocoa Plugin>
 こちらの記事にある通り、以前作成した時は、64bitでビルドしたプラグインはXojoが認識しませんでした。これはXojoのビルドを32bitとしたためかもしれませんが、詳細は未調査です。
 現状、確認する予定はありません。
 大雑把に、ではありますが、Xcode 11.2で64bitビルドしたプラグインがXojo 2019r1.1で機能することを確認しました。
 詳細は、こちらの記事をご覧ください。

<CarbonのDeclare>
 64bitに対応していないAPI(例えばQuickDraw系)を使っていると、ビルド時にリンクエラーが発生します。
(裏を返せば、リンクエラーが発生しないCarbon APIなら、使い続けてもOK?)

<その他>
 本コラム内では利用していませんが、VariantもMemoryBlockと似たような状況と思われます。
(例えば、Variant.TypeIntegerは、64bitではVariant.TypeInt64に変更しないとダメなようです。)

(上記<CocoaのDeclare>のVariantの項参照。なお、TypeInteger,TypeInt64はClass Constantsなので間違い。IntegerValue,Int64Valueにお詫びして訂正。)

<2016r3>
 以下の制約があります。
・VirtualVolumeがダメ(ストリームにアクセスできない)(2017r2で解決済)

<2017r1.1>
 以下の制約があります。
・Split()の入力が日本語だと、結果が文字化けする(NthField()は問題ないので代替可)(2017r2で解決済)
・HTTPSecureSocket.Get()が異常終了(少なくとも2018r1.1では解決済)

<2018r1.1>
 以下の制約があります。
・SMTPSocketが機能しない?(代わりにSMTPSecureSocketを使えばOK)
(本件は64bit固有の問題なのかは判然としない。ちなみに、SMTPSocketは2018r4でdeprecatedになってSMTPSecureSocketが推奨されている)


[Home]  [MacSoft]  [Donation]  [History]  [Privacy Policy]  [Affiliate Policy]