2

ここには同じテーマについて質問されたスレッドがいくつかあることは知っていますが、残念ながらそれらのどれも私を助けませんでした.

.net アプリケーションでアンマネージ C++ コードのラッパーを使用しています。アンマネージ Dll には、LoadLayoutFile()拡張子 ( .lyt) を持つカスタム形式のファイルをロードする関数 " " があります。私の .net アプリケーションには、に基づいてその関数を呼び出すループがあります。配列アイテム数。この配列に項目が 1 つある場合、アプリケーションは問題なくスムーズに実行されますが、項目が複数ある場合、アプリケーションはすぐにクラッシュします。もちろん、何が起こったのかを理解する機会はありません。また、非常に紛らわしいです。

クラッシュを追跡するためにDebugDiag、Windbgを試しましたが、成功しませんでした。また、デストラクタ、例外処理を追加して、アンマネージ コードを修正しようとしました。また、(.net アプリケーション内の) ガベージ コレクタを本来あるべき場所に配置しようとしましたが、これらのどれも機能しませんでした。何が起こっているのか知りたいですか?または少なくともエラーをキャッチできるようにするために!

C++ dll の LoadLayoutFile() は次のとおりです。

int CMKCRD32App::LoadLayoutFile(LPCSTR lpszFileName)
{
    try
    {
        int     nRetVal = MCRC_SUCCESS;
        CFile   file;
        WORD    wVersionNumber;

        // Add New Layout to the Layouts List
        nRetVal = AddLayout();

        // If Layout not added Correctly return Error Code
        if(nRetVal<0)
            return MCRC_MAXLAYOUT_REACHED;

        if(file.Open(lpszFileName,CFile::modeRead|CFile::shareCompat))
        {
            CArchive    ar(&file,CArchive::load);

            ar >> wVersionNumber;

            m_pCard[nRetVal]->Serialize(ar,wVersionNumber);

            ar.Close();
            file.Close();

            m_pCard[nRetVal]->OffsetItemsByMargin(TRUE);
        }
        else
        {
            nRetVal = MCRC_ERROROPENFILE;
        }

        return nRetVal;
    }
    catch(char *str)
    {
        throw str;
    }
}

AddLayout()

int CMKCRD32App::AddLayout()
{
    int nIndex;
    try
    {
        for(nIndex=(_MAX_LAYOUTS_-1); nIndex >= 0; nIndex--)
            if(m_pCard[nIndex]==NULL)
                break;

        if(nIndex>=0)
        {
            m_pCard[nIndex] = new CLYT_Card();

            if(!m_pCard[nIndex])
            {
                nIndex = -1;
            }
        }

        return nIndex;
    }
    catch(char *str)
    {
        throw str;
    }

}

そして、ここで正確に.netアプリケーションでクラッシュします(時々):

CardLayout cardLayout = new CardLayout(); // Wrapper

foreach(var item in x)
   int layout = cardLayout.LoadLayoutFile("cc.lyt");
4

1 に答える 1

2

ライブラリは正常に見えます。パフォーマンスの問題である可能性があり、スタックトレースが大きい可能性があります。一度呼び出すとクラッシュせず、それ以上呼び出すとクラッシュする場合(あなたが言ったように)、特にライブラリに画像処理ジョブがある場合は、メモリ内の巨大なオブジェクトが原因である可能性があります(私はそれは私がlayoutファイルを見たからです)そしてそれはそれらを適切に破壊しません。

デスクトップアプリケーションコードをそのライブラリを呼び出す部分から分離することをお勧めします。別のスレッドで動作させるか、そのコードセグメントをコンソールアプリケーションに配置して、そのコンソールアプリケーションをから呼び出す必要があります。デスクトップアプリケーション。これにより、それらが互いに分離され、クラッシュが発生した場合でも、デスクトップアプリケーションに影響はありません。

于 2012-11-04T05:59:44.237 に答える