Внедрение CLR в старую MFC / Win32 DLL и размещение DLL в приложении MFC / Win32 - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть старое приложение 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}

1 Ответ

0 голосов
/ 22 декабря 2011

Объединение MFC и .NET / CLR вряд ли будет работать, если только вы не можете перекомпилировать старое приложение MFC с поддержкой CLR . Даже тогда я бы сильно обескуражил это; эти две структуры не предназначены для одновременного использования. Имейте в виду, что вы можете использовать только один поток GUI, даже если вы не используете MFC.

Лучшим решением было бы использование стандартных механизмов потоков MFC. Это действительно не сложно; просто создайте новый класс с функцией-членом, например так:

static UINT Go(LPVOID pParam);

Затем позвоните AfxBeginThread(Go, this) из другого места в вашем классе. Пересмотрите pParam, чтобы он указывал на ваш класс, а затем начинайте вызывать функции для него. Вам не нужно использовать что-то необычное, чтобы эта стратегия работала в MFC, и у вас есть все стандартные доступные ресурсы Win32 / MFC / C ++. Скажите мне, что вам нужно от .NET, и я уверен, что смогу найти способ сделать то же самое в C ++ или через COM.

...