Member 13261094 Ответов: 0

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, так что все, очевидно, изменилось.

0 Ответов