Click here to Skip to main content
Licence CPOL
First Posted 3 Mar 2002
Views 201,363
Bookmarked 30 times

VC++ Appwizard to create a Managed MFC Regular DLL

By | 8 Mar 2002 | Article
A wizard to create a Managed C++ class library which is also a MFC regular DLL

Sample Image - ManagedMFCDLL.gif

This wizard allows you to build a managed C++ dynamic link library which also serves as an MFC regular DLL. I developed this wizard when I was trying to figure out a way to convert MFC controls into windows forms control (an article on this would follow). Since I still used existing MFC code through IJW it made sense to make the managed assembly also a MFC regular DLL.

The wizard creates following files :-

  • <project name>.cpp - Implementation and declaration of CWinApp derived class.
  • <project name>.h - Decalration of a managed class Class1
  • AssemblyInfo.cpp - Assembly attributes decalrations
  • stdafx.h - Has #includes for common MFC headers and #using for mscorlib.dll.
  • stdafx.cpp - To create precompiled header file
  • resource.h
  • <project name>.rc
  • res\<project name>.rc2

The wizard takes care of all the required project settings. Here is how the <project name.cpp> file looks like

// This is the main DLL file.

#include "stdafx.h"

#include "Test.h"

#pragma unmanaged

//Place all unmanaged code between these blocks

// CTestApp
// See Test.cpp for the implementation of this class
//

class CTestApp : public CWinApp
{
public:
	CTestApp();

// Overrides
public:
	virtual BOOL InitInstance();

	DECLARE_MESSAGE_MAP()
};

//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

// CTestApp

BEGIN_MESSAGE_MAP(CTestApp, CWinApp)
END_MESSAGE_MAP()

// CTestApp construction

CTestApp::CTestApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}


// The one and only CTestApp object

CTestApp theApp;

// CTestApp initialization

BOOL CTestApp::InitInstance()
{
	CWinApp::InitInstance();

	return TRUE;
}

#pragma managed

Note that the implementation is enclosed within #pragma unmanaged and #pragma managed blocks to force the generation of native code. By default any file include in the project gets compiled into IL.

I recommend that you build a separate MFC static library for any MFC code you want to include in the managed code and link it with this DLL. Place only managed code in this DLL. This clean separation turns out to be very useful. One of the thing to be careful about is to mainatin the state of MFC module using AFX_MANAGE_STATE If this DLL is dynamically linked against the MFC DLLs (default). Any managed methods called from external sources should be enclosed with AFX_MANAGE_STATE(AfxGetStaticModuleState()); This is neccessary if the code calls any (well most) MFC functions.

Here are the steps you must take to install the wizard :-

  1. Unzip all files to any directory. Lets call the directory <install dir>
  2. Copy ManagedMFCDLL.vsdir, ManagedMFCDLL.vsz, ManagedMFCDLL.ico to <vsinstalldir>/VC7/VCProjects directory. <vsinstalldir> is the directory where you installed VS.NET.
  3. Finally you need to modify ManagedMFCDLL.vsz which looks like this
    VSWIZARD 7.0
    Wizard=VsWizard.VsWizardEngine
    
    Param="WIZARD_NAME = ManagedMFCDLL"
    Param="ABSOLUTE_PATH = G:\wksrc\ManagedMFCDLL"
    Param="FALLBACK_LCID = 1033"
    Param="WIZARD_UI = FALSE"
    Param="SOURCE_FILTER = txt"		
    		

You need to replace g:\wksrc\ManagedMFCDLL to the path where you unzipped the files (<install dir>).

That's all there is to it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Rama Krishna Vavilala

Architect

United States United States

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Question[My vote of 1] rofl i learned alot about nothing from this article Pinmembera ahole8:19 26 Jun '11  
QuestionCould you please update to support VS2005? Pinmemberwshcdr21:04 5 May '10  
GeneralUse VB2005 dll in unmanaged vc++ Pinmembercmasantos1:50 22 Oct '08  
I'm using a unmanaged MFC application, and I want to use a vb2005 dll. I use this dll, and I can see the namesapce and the class inside it, but when I try to create a new instance of this class, it doesn't work. Can anybody help me on this issue?
The code I wrote is like this:
 
#import "ClassLibraryCom.tlb"
using namespace ClassLibraryCom;
 
void main()
{
  ClassLibraryCom::ReadWrite test; // Here it says that the Class "ReadWrite" is a struct... and I can't see any methodes...
}
 
Thank's in advance.
 
Carlos Santos
QuestionDoes not work in VS 2005 Pinmemberdaaboots3:46 27 Dec '07  
GeneralRe: Does not work in VS 2005 PinmvpRama Krishna Vavilala4:55 27 Dec '07  
GeneralRe: Does not work in VS 2005 Pinmemberdaaboots5:03 27 Dec '07  
QuestionThis is a great Hack, but why does the class derive from CWinApp? Pinmembergunag3:14 10 Jul '06  
AnswerRe: This is a great Hack, but why does the class derive from CWinApp? PinmemberRama Krishna Vavilala3:30 10 Jul '06  
GeneralRe: This is a great Hack, but why does the class derive from CWinApp? Pinmembergunag22:52 10 Jul '06  
GeneralProblem moving mfc dll to another machine PinsussAnonymous16:17 3 Dec '04  
QuestionRe: Problem moving mfc dll to another machine PinmemberJulie JP4:53 22 Sep '05  
GeneralManaged Code in MFC 7.0 Application PinmemberLiaqat8:11 4 May '04  
Generalerror RC2135 : file not found: myproject.tlb Pinmemberfftz20:23 30 Mar '04  
GeneralRe: error RC2135 : file not found: myproject.tlb Pinmemberruida20:45 18 Apr '04  
GeneralRe: error RC2135 : file not found: myproject.tlb PinmemberEliya Mirov21:44 5 May '07  
GeneralChanges for VS.NET v.7.1 Pinmemberigor_patlan6:58 6 Feb '04  
GeneralRe: Changes for VS.NET v.7.1 Pinsussmensikd1:16 21 Jan '05  
GeneralRe: Changes for VS.NET v.7.1 PinmemberMartin_M_842:25 27 Feb '06  
GeneralLNK4243 Error PinsussKeith Rule13:28 4 Feb '04  
Generallink MFC->C++.NET Pinmemberkikos french .NET developer4:31 22 Jan '04  
GeneralDoes not work in VS 2003 Pinmembersalims20:58 10 Nov '03  
GeneralRe: Does not work in VS 2003 - Fix Pinmemberrcgosse11:51 25 Jan '04  
GeneralI get an afxwin1.inl assertion on line 26 when trying to use an MFC dialog or frame from C#. PinmemberjohnWise9:37 27 Oct '03  
GeneralRe: I get an afxwin1.inl assertion on line 26 when trying to use an MFC dialog or frame from C#. PinmemberjohnWise10:40 27 Oct '03  
GeneralMemory Leak PinmemberUma Mahes18:14 7 Jul '03  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120529.1 | Last Updated 9 Mar 2002
Article Copyright 2002 by Rama Krishna Vavilala
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid