2

グーグルで数時間過ごした後、専門家に聞いてみる時が来たと思います。VS 2005に移植しようとしているレガシーモジュール(MS Visual C ++ 6.0)があります。多数の呼び出し元アプリケーションが存在するため、可能であれば、これらの下位互換性を維持しようとしています。

コード的には、これは非常に簡単で、数時間の開発ですべてのコンパイラエラーとほとんどの警告が排除されました。

次に、リンク手順でいくつかの「未解決の外部シンボル」エラーに遭遇しました。これは、装飾された名前の微妙な違いのようです。

1セットのエラーは、time_tがVS2005の64ビット構造であることに関連していることが判明しました_USE_32BIT_TIME_T。これらの3つを修正しました。

今、私は残りの2つのエラーで立ち往生しています:

関数は次のように定義されます

int RC_STATE::my_function(UINT stateId, UINT period, UINT index, UINT paramtype, UINT dpindex, UINT managerId, UINT calctype, UINT status, double *p_val, long *p_isc, CTime *p_time)

「古い」VisualStudioの下では、装飾された名前に満足していたようです

?my_function@RC_STATE@@QAEHIIIIIIIIPANPAJPAVCTime@@@Z

しかし今、VS2005は「CTime」パラメータにATL名前空間を含めたいと考えています。

?my_function@RC_STATE@@QAEHIIIIIIIIPANPAJPAVCTime@ATL@@@Z

この新しい装飾された名前で.DEFファイルを更新すると、コンパイルとリンクが行われます...やった!そのDLLを、以前は機能していたコードで削除するとすぐに、DLL内にプロシージャのエントリポイント(つまり、「古い」構造で名前空間がないもの)が見つからないと文句を言います。

助言がありますか?装飾された名前に名前空間を入れないようにコンパイラに指示できる、ある種のキーワード、コンパイラ指令はありますか(名前空間は良いことは知っていますが、名前空間を必要とするCTimeタイプとの競合はありません競合を解決します)。

装飾された名前を古い形式と一致させるための回避策はありますか?

どんな提案にも前もって感謝します。

4

2 に答える 2

3

ここには実際には 2 つの問題があります。まず、あなたが見つけたようCTimeに名前空間にありますが、VS2005でも32ビットではなく64ビットであり、定義によって変更されません.ATLCTime__time64_t_USE_32BIT_TIME_T

したがって、名前空間の問題を修正したとしても、アプリケーションが VC6 でコンパイルされ、DLL が VS2005 でコンパイルされている場合 (またはその逆)、CTimeこれらのモジュール間でオブジェクトを渡すと、ほぼ確実にデータ破損の問題が発生します。メモリーレイアウト。

time_t私の見解では、解決策はすべてのコードを VS2005 で再コンパイルし、VS2005と一貫性のある 64 ビットを使用するCTimeことです (つまり、 を使用しないでください_USE_32BIT_TIME_T)。

これが役立つことを願っています!

于 2009-01-24T00:34:21.670 に答える