У меня есть старое приложение MFC, в которое я сейчас импортирую старую MFC / Win32 DLL.
В этой старой DLL мне было поручено написать несколько многопоточных кодов, которые я планировал написать с использованием .NET Framework (следовательно, нуждался в CLR).
Я уже делал это, и даже если я смогу правильно скомпилировать проект с CLR, я обнаружил, что, как только я пытаюсь использовать пользовательский интерфейс DLL (написанный на MFC) после загрузки DLL в приложении MFC / Win32 происходит сбой приложения, указывающий на проблемы с пользовательским интерфейсом.
Эта DLL всегда работала без CLR, поэтому я знаю, что она не сломана.
Каков наилучший способ реализации CLR в моем проекте, даже если он предназначен только для одного класса?
РЕДАКТИРОВАТЬ : В настоящее время я могу получить код для сборки с CLR только на одном классе, в котором он мне нужен, но приложение, в которое я загружаю DLL, все еще вылетает при попытке загрузить содержащийся пользовательский интерфейс. в DLL.
EDIT2 : Я выяснил, что оно не соответствует утверждению afxCurrentResourceHandle
в afxwin1.inl
. После прочтения у меня возникло ощущение, что это связано с тем, что MFC находится в «общей DLL» вместо «статической DLL». Есть ли обходной путь для этого утверждения?
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
return afxCurrentResourceHandle; }
EDIT3 : я добился прогресса, но все еще не могу утверждать! Очевидно, прежде чем создавать объекты страниц в пользовательском интерфейсе, необходимо использовать макрос AFX_MANAGE_STATE
, чтобы определить afxCurrentResourceHandle!
Вот пример того, что я имею в виду:
CPropertySheet Sheet("Config"); //Assume this is defined
AFX_MANAGE_STATE(AfxGetStaticModuleStatus());
CConfigPage ConfigPage;
CTestPage TestPage;
//Now I am failing an assertion when trying to run the following code
if (Sheet.DoModal() == ID_OK)
{
//Do stuff...
}
Утверждение, которое в настоящее время не выполняется:
CObject* AFX_CDECL AfxStaticDownCast(CRunTimeClass* pClass, CObject* pObject)
{
ASSERT(pObject == NULL || pObject->IsKindOf(pClass));
return pObject
}
pObject, конечно, не равен нулю: pObject: 0x043fd4fc {CWnd hWnd=0x002c0abe}