Loadlibrary() повреждает основную память/поток в VS 2019
LoadLibrary обнуляет объект мэйнфрейма. Этот код прекрасно работает в VS2010.
//Код для заголовочного файла..
#if !defined(AFX_SIRRETVALUE_H__EF8A65E0_26FD_11D7_BA6A_4000040D08A6__INCLUDED_) #define AFX_SIRRETVALUE_H__EF8A65E0_26FD_11D7_BA6A_4000040D08A6__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols class CSIRRETVALUEApp : public CWinApp { public: CSIRRETVALUEApp(); DECLARE_MESSAGE_MAP() }; #endif // !defined(AFX_SIRRETVALUE_H__EF8A65E0_26FD_11D7_BA6A_4000040D08A6__INCLUDED_) ***************************************************************************************************************************************************************
//DLL Code #include "stdafx.h" #include "SiRValue.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BEGIN_MESSAGE_MAP(CSIRRETVALUEApp, CWinApp) //{{AFX_MSG_MAP(CSiRValueApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() CSIRRETVALUEApp::CSIRRETVALUEApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } CSIRRETVALUEApp theApp; extern "C" __declspec( dllexport ) String *FireRule( CObList& list ) { AFX_MAINTAIN_STATE2 *pState = new AFX_MAINTAIN_STATE2(AfxGetStaticModuleState()); return (CString*)"Test"; } // End of FireRule function ***************************************************************************************************************************************************************************************
//Вызывающий код, написанный в программе MFC.....
ConvFrameWnd* pFrame1 = (ConvFrameWnd*)AfxGetApp()->m_pMainWnd; HINSTANCE hModule; hModule = LoadLibrary("SiRValue.Dll"); ConvFrameWnd* pFrame = (ConvFrameWnd*)AfxGetApp()->m_pMainWnd;
Что я уже пробовал:
В вызывающей программе(mfc)pFrame1 инициализируется правильно.hModule также показывает мне значение(не null). Но объект pFRame является нулевым сразу после loadlibrary. Я не в состоянии понять причину , почему pFrame равен нулю.
Richard MacCutchan
Вы создаете новый объект приложения в библиотеке dll, который, вероятно, вызывает проблемы. Ваш dll-код больше похож на основную программу, я не вижу никакой цели в том, чтобы он был построен как dll.
Randor
Библиотеки DLL MFC на самом деле должны быть производным классом CWinApp.
Richard MacCutchan
Прошло много времени с тех пор, как я использовал MFC, так что все, очевидно, изменилось.