ホームページ>開発ツール>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]