0

現在、クライアントのブランディングを目的として、MFC ベースのアプリケーションから DLL に多くのコードを移植しています。

珍しい問題に遭遇しました。このコードは、両方のシステムで同じです。

// ...
    CCommsProperties props;

    pController->GetProperties( props );
    if (props.handshake != HANDSHAKE_RTS_CTS) 
    {
        props.handshake = HANDSHAKE_RTS_CTS;
        pController->RefreshCommProperties( props );
    }

// ... in another file: 
void CControllerSI::RefreshCommProperties ( const CCommsProperties& props )
{
    // ... code ...
}

CommProperties は通信設定、シリアル化などのラッパーであり、pController は ControllerSI 型であり、それ自体が実際の通信とアプリケーションの間のレイヤーです。

元の MFC バージョンでは RTS-CTS へのハンドシェイクの設定が固執しますが、DLL バージョンとして実行すると、関数に入るとすぐに 0 にリセットされます。コードは完全にコードの DLL セクションに含まれているため、境界はありません。

元のモジュールと新しいモジュールの主な違いは、さまざまなダイアログを呼び出す変数が削除され、#include が削除されたことです。

これで午後を失いましたが、これ以上失いたくありません...

4

4 に答える 4

1

与えられたコードだけでは、何が問題なのかを特定するのは困難です。いくつかの一般的な指針:

  1. オブジェクトは、互換性のないリンク (C ランタイムなど) を持つ異なるバイナリ モジュールで初期化および処理されます。

  2. クラス/構造が共有されている場合、正しくエクスポート/インポートされません。

  3. クラスが複数の場所で定義されており、正しい定義が含まれていません。

上記の 3 つは、特にすべてのフィールドがデフォルトの初期値にリセットされた場合に、最も可能性の高い原因です。

これが 1 つまたは 2 つのフィールドのみで発生している場合は、構造が適切に配置されていない可能性があり、これらを修正するためにフィールドを再配置する必要がある場合があります (リリースでも確認してください)。

一般に、あなたが初期化したオブジェクトはRefreshCommProperties()、何らかの理由で、上記の 3 つのいずれかである可能性があります。

于 2008-10-02T09:54:19.097 に答える
0

Saratvの投稿後、私は自分が行ったことを捨てて、作業ソースから再開することにしました。

今回は機能しますが...構造体を渡すことで構造体が変更された理由はわかりません。

于 2008-10-02T14:14:41.887 に答える
0

何が起こっているのかを実際に理解するには、おそらくソースコードを投稿する必要があります。少なくとも、問題を再現するのと同じくらいの量を投稿する必要があります。残念ながら、StackOverflowはこれを奨励しているようには見えません。FTPサイトにコードを投稿するか、ソースコードの投稿を許可するサイト(CodeGuruなど)にアクセスすることができます。

于 2008-10-02T10:51:26.043 に答える
0

CCommsProperties が 2 つの異なる場所で定義され、各ファイルに独自のバージョンが含まれている可能性があります。

この理論をテストするには、デバッガーで &props.handshake を確認する必要があります。フィールドのアドレスが関数の内外で異なることがデバッガーによって示された場合、仮説は真であり、プリプロセッサーの出力を調べて、その理由を突き止めることができます。

于 2008-10-02T11:54:18.340 に答える