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