2017-01-11 4 views
-1

私は他の開発者が自分のDLLを拡張機能として書くことを可能にする一連のDLLを書いています。 Delphiのコードでは、私は広くenumとenumを使います。私はDLLを使ってenumを使用します。 Delphiでコンパイルされたさまざまなプロジェクト間でDLLを使って列挙型を安全に使用できることはわかっています。しかし、私は様々な言語にどれくらい適応できるかについてはわかりません。相互参照境界で列挙型を使用するのは安全ですか?

他のさまざまな言語をサポートしている間にDLLを使用してenumを使用することは安全ですか?または、代わりに整数としてキャストする必要がありますか?

+3

列挙型は、序数として渡される必要があるだろう、とあなたのDelphiのコードが使用する必要があります[{$ MINENUMSIZE}](http://docwiki.embarcadero.com/RADStudio/Berlin/en/Minimum_enumeration_size_%28Delphi%29)へプラットフォーム間で互換性があるように適切なサイズの序数を使用していることを確認してください。 Delphiは列挙の要素の数に応じて異なるバイトサイズの値に列挙します。これにより、非Delphiコードで前後するいくつかの問題が発生する可能性があります。 –

+0

Cの列挙型はint型であるため、interopの最小列挙サイズは4です。 –

+0

@David:C99によれば、コンパイラがそれを望むならば、intより小さいかもしれません。しかし、実際には、Windowsでは、それらはすべて4バイト(int)のサイズになります。 –

答えて

1

列挙型は整数(WordまたはDWORD)として渡す必要があり、適切なサイズであることを確認するには、コンパイラ指令{$MINENUMSIZE}(AKA {$Z})を使用する必要があります。あなたがそうしない限り、Delphiコンパイラは列挙型の値の数に基づいて異なるサイズを使用します。

Windows OSでC/C++コードと相互運用する場合は、{$MINENUMSIZE 4}を使用してください。

私は相互運用して上記のアドレスをリンクドキュメントC/C++ - 第三項を参照してください。

の$ Z指令は、Delphiの最小のストレージサイズが列挙型のコントロールを。

列挙型は、列挙型の値が256以下で、型が{$ Z1}状態(既定値)で宣言されている場合は、符号なしバイトとして格納されます。列挙型が256より大きい値を持つ場合、または型が{$ Z2}状態で宣言された場合、その型は符号なしの単語として格納されます。最後に、列挙型が{$ Z4}状態で宣言されている場合、それは符号なしダブルワードとして格納されます。

{$ Z2}と{$ Z4}状態は、CやC++ライブラリとのインタフェースに役立ちます。通常、列挙型は単語やダブルワードとして表現されます。

関連する問題