15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Modeless dialog box and DLL

Severino Delaurenti -- del@alpha.ico.olivetti.com
Tuesday, February 27, 1996

I'm using Visual C++ 2.1 on Windows 95
I'm trying to write a DLL, using MFC in a shared DLL, which displays a
modeless dialog box whose template is located in the RC file as IDD_MY_DIALOG.

My DllMain function looks like that:

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("TWAIN.DLL Initializing!\n");
		
		afxCurrentInstanceHandle = hInstance;
		afxCurrentResourceHandle = hInstance;
 
		// Extension DLL one-time initialization
		AfxInitExtensionModule(twainDLL, hInstance);

		// Insert this DLL into the resource chain
		new CDynLinkLibrary(twainDLL);
        }
        .
        etc.
        .
}

When I call the Create function with the following code

CMyDlg	MyDlg;
MyDlg.Create ("IDD_MY_DIALOG");

I get on the Output window the following message:

ERROR: Cannot find dialog template named 'IDD_MY_DIALOG'.

Stepping through the MFC source code I noticed that the function
_AfxCheckDialogTemplate () returned FALSE after calling the API function
::FindResource () that returned NULL.

Now: I'm sure that in my RC file the template is present.

Somebody can tell me what is wrong about the code ?

Thanks in advance.




David W. Gillett -- DGILLETT@expertedge.com
Thursday, February 29, 1996

[Mini-digest: 3 responses]

> When I call the Create function with the following code
> 
> CMyDlg	MyDlg;
> MyDlg.Create ("IDD_MY_DIALOG");
> 
> I get on the Output window the following message:
> 
> ERROR: Cannot find dialog template named 'IDD_MY_DIALOG'.

  I'm about 93% certain that you'll find that the ID of your dialog 
template is not a *string*, let alone the string "IDD_MY_DIALOG".  
It's far, far more likely that its ID is a *number*, and that in 
resource.h you will find a line that looks like

#define  IDD_MY_DIALOG  nnn

where nnn is the number in question.

  Try removing the quotes around the parameter you're passing to 
Create().

Dave

 
-----From: michael 

The last time I developed a shared DLL with a modeless dialog box the
calling program passed its main window handle.

 For example,
    MySharedDLL (CMDIFrameWnd*)AfxGetMainWnd());

Your DLL would create the dialog as follows:
    CMyDlg* pDlg;
    pDlg = new CMyDlg;
    pDlg->Create(IDD_MYDIALOG, pMainWnd); 

Notes:
1:  The parameter pMainWnd is the window handle passed by the caller. 
2.   I had to "new" the dialog pointer. This is a departure from convention
      but I couldn't make it work without it.

Michael L. Thal
Data Tree Corporation
voice: (619)231-3300
fax:      (619)231-3301

-----From: DAVISTOD@gw2k.com

The answer to this question can be found by accessing TN057, either on the 
MS
Development Library CD, or it might be on the VC++ 2.1 Help, also.  The path 
to get to this technote on MS Dev Library is

Product Documentation
   Languages
     Visual C++ 4.0 (32-bit)
         MFC Notes
              MFC Technical Notes Index
                    TN057

Or do a query for TN057.

Basically, you need to tell MFC to load resources from your DLL.  The 
technote gives all the gory details.

Todd Davis
Gateway 2000




| Вернуться в корень Архива |