July 21: updated, see bottom
In VC ++ 2005, I have 2 projects. Firstly, the MFC DLL project (and not the extension DLL), which has a simple dialog:
TestDlg.h
#pragma once #include "afxwin.h" #include "resource.h"
Then I have a Win32 console application with MFC libraries that does:
TestApp.cpp
#include "stdafx.h" #include "TestApp.h" #include <TestDlg.h> #ifdef _DEBUG #define new DEBUG_NEW #endif CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: MFC initialization failed\n")); nRetCode = 1; } else { Dialogs::CTestDlg dlg; dlg.DoModal(); } return nRetCode; }
It builds and starts, but the dialogue does not appear. Going to DoModal () ...
dlgcore.cpp
INT_PTR CDialog::DoModal() { // can be constructed with a resource template or InitModalIndirect ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL || m_lpDialogTemplate != NULL); // load resource as necessary LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate; HGLOBAL hDialogTemplate = m_hDialogTemplate; HINSTANCE hInst = AfxGetResourceHandle(); if (m_lpszTemplateName != NULL) { hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG); HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG); hDialogTemplate = LoadResource(hInst, hResource); } if (hDialogTemplate != NULL) lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate); // return -1 in case of failure to load the dialog template resource if (lpDialogTemplate == NULL) return -1; ... more stuff
For some reason, it seems that it cannot load the resource, returning -1 at the end of the copied section. I looked through several articles about CodeGuru, etc., and did not see anything obvious. Is my class not exported / imported? Or is it a resource problem? Or the problem I'm trying to display from the console (MFC)?
July 21st update I created an overridden DoModal like this:
INT_PTR CTestDlg::DoModal() { AFX_MANAGE_STATE(AfxGetStaticModuleState( )); return CDialog::DoModal(); }
This seems to work though I have to redefine another method to get more universal functionality?