Непрерывная утечка памяти при использовании WpfHWndSource - PullRequest
0 голосов
/ 02 июня 2010

Мне нужно загрузить пользовательский элемент управления WPF в диалоге MFC, который вызывается из элемента управления ocx. Для этого я создал MFC Regular Dll (Regular dll в смешанном режиме с включенной опцией clr), я создал диалог, в котором размещается пользовательский элемент управления wpf с помощью HWndSource. Этот экспортированный диалог помещается как дочерний диалог thr над диалоговым окном MFC, которое вызывается из ocx. В промежуточном диалоговом окне используется код C ++ / Cli.

Когда основной диалог MFC закрыт, я удаляю ссылку ptr промежуточного диалога, созданного в куче. Но там, после того, как я все еще вижу постоянную утечку или рост памяти. В деструкторе диалога я вызываю delete на HWndSource и пользовательском элементе управления wpf, чтобы вызывать его удаление.

Но я вижу там непрерывную утечку.

Любая помощь в этом отношении будет полезна.

1 Ответ

0 голосов
/ 04 июня 2010

Могут возникнуть некоторые проблемы в Google, с постоянной утечкой 4 КБ при использовании HWndSource. Кажется, моя проблема схожа с этим.

Утечка памяти WPF в XP (CMilChannel, HWND)

Я смоделировал эту проблему в примере приложения MFC Dilaog, которое похоже на мое настоящее приложение для разработки. В конструкторе приложений я сначала создал фиктивный объект HWndSource, и он, похоже, показывает улучшение утечки памяти.

Я добавил еще одну экспортированную функцию в мой промежуточный dll mfc с поддержкой clr, который создает HWndSource. Я вызываю эту экспортированную функцию из конструктора моего приложения.

void CConnectionPanelExport::CreateHwndSource()
{
    HWND hwnd = (HWND)(gcnew  System::Windows::Interop::HwndSource(*gcnew  
      System::Windows::Interop::HwndSourceParameters("MyApplication")))->Handle.ToPointer();
    CWnd *temp= CWnd::FromHandle(hwnd);
    temp->ShowWindow(SW_HIDE);
}

Из конструктора моего приложения я позвонил

CConnectionPanelExport connectionPanelExport;
connectionPanelExport.CreateHwndSource();

Кажется, это контролирует память приложения, но на самом деле я не мог понять проблему.

Я пытался реализовать это в моем реальном приложении разработки, и я вижу, что приложение закрывается, когда я вызываю этот экспортированный метод dll с поддержкой / clr. Я делаю статическое связывание DLL с поддержкой clr в основном приложении без поддержки clr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...