2016-08-12 14 views
0

64ビットのDLLを使用する64ビットのDelphiエクスポートプログラムを作成しています。私が得る問題は、c DLLがDelphiのenumを認識せず、間違ったデータ型のエラーを返すことです。私は{$ packenums}や{$ Z}ディレクティブをDelphiコンパイラに使ってみましたが、同じエラーが返されました。私はxe8 Delphiを使用しています。列挙型は、次のようになります。Cヘッダに64ビットのDLLを64ビットのDelphiで読み込むときの列挙の問題

type 
DDCDataType=(
    DDC_notype = 0, 
    DDC_UInt8 = 5, // unsigned char 
    DDC_Int16 = 2, // short 
    DDC_Int32 = 3, // int 
    DDC_Float = 9, // float -> single 
    DDC_Double = 10, // double 
    DDC_String = 23 // string 
); 

私はこれが意味:) 感謝します願っています

typedef enum { 
    DDC_UInt8 = 5, // unsigned char 
    DDC_Int16 = 2, // short 
    DDC_Int32 = 3, // int 
    DDC_Float = 9, // float 
    DDC_Double = 10, // double 
    DDC_String = 23, // string 
    DDC_Timestamp = 30, // timestamp (Year/Month/Day/Hour/Minute/Second/Millisecond components) 
} DDCDataType; 

のように見えます!

+0

ここではあまり意味をなさない。なぜあなたは値をコメントアウトしましたか?確かに彼らは重要です。 Cコードも見えませんか?どのようにして目標が何であるかを知ることができます。あなたの問題を除いて、ここでは私の単純なSO interopの最大値で学ぶ機会があります:* interopの質問は常にinteropの境界の両側を提示する必要があります*。あなたは片面を提示しただけです。 –

+0

私はコメントとノーの両方で試してみましたが、同じ理由で同じ理由で作業していました。 – Primus

+0

あなたが間違った値を指定した場合、どのように動作する可能性がありますか?試行錯誤。それはあなたのために今まで働いていますか? –

答えて

1

CコードのDDCDataTypeは、単にintです。つまり、サイズが4であることを意味します。Delphiコードでは、デフォルトのコンパイラ設定で、列挙型のサイズは1です。{$Z4}を使用してCコードと一致させる必要があります。

プロジェクト全体で{$Z4}を使用したくない場合は、おそらくデルファイのinteropユニットに配置するだけです。インポートされる型と関数を定義する単位。その相互運用コードを他のアプリケーションロジックと混在させてしまった場合は、明確な分離を維持するための機会を今すぐ利用してください。

あなたはタイプを忠実に翻訳していません。あなたは値を追加し、値を見逃しました。

{$Z4} 
type 
    DDCDataType=(
    DDC_UInt8 = 5,  // unsigned char 
    DDC_Int16 = 2,  // short 
    DDC_Int32 = 3,  // int 
    DDC_Float = 9,  // float 
    DDC_Double = 10, // double 
    DDC_String = 23, // string 
    DDC_Timestamp = 30, // timestamp (Year/Month/Day/Hour/Minute/Second/Millisecond components) 
); 

この宣言を使用すると、この型がCコードと正確に一致することが確信できます。あなたのプログラムにはおそらく他の問題があります。残りのプログラムが失敗した場合は、驚かないでください。私はあなたがここで尋ねた質問にちょうど答えました。

上記の宣言を使用してもプログラムが失敗した場合は、原因を他の場所で調べることができます。

+0

あなたが質問した質問にちょうど答えています。明らかに私はここにない他のコードをデバッグすることはできません。どうすればそのことができるだろうか。私の最後の段落は先見的だったようです。私たちが遠くからあなたのプログラムをデバッグできることを望むのではなく、自分でデバッグするのはなぜですか?あなたにとって私たちよりも簡単かもしれません。 –

+0

@Primus:David Heffernanの翻訳は正しいです。彼が言ったように、まだ問題があるなら、それはenumの宣言のためではありません。しかし、Cコードの間違った変換に起因する他の問題があったとしても私には驚かないでしょう。このようなヘッダーファイルを変換する方法については、私の記事["Pitfalls of converting"](http://www.rvelthuis.de/articles/articles-convert.html)をご覧ください。特に、誤って実行された場合、しばしば失敗の原因となるレコードの配置、パラメータ、呼び出し規約を見てください。 –

関連する問題