Bonjour,

Ma solution est composée de:
- 1 executable codé en C# qui fait référence à:
- 1 Dll "regular" codée en C++/CLI qui fait référence à:
- 1 Dll d'extension possédant des boites de dialogues et autres resources MFC

L'appel et l'affichage des boites de dialogues sous Visual 2003 fonctionnait bien. Mais depuis le passage à Visual 2005 et à l'option \CLR (au lieu de \CLR old syntaxe) pour la compil de Dll regular, impossible d'afficher les boites de dialogue (AfxGetResourceHandle retourne NULL).

Je suis reparti de 0 en créant une nouvelle Dll "regular" qui appelle une nouvelle Dll d'extension et toujours le même problème.

Le code de la dllMain de la Dll d'extension est le suivant (classique):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
static AFX_EXTENSION_MODULE DllExtensionResourceDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	// Remove this if you use lpReserved
	UNREFERENCED_PARAMETER(lpReserved);
 
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("DllExtensionResource.DLL Initializing!\n");
 
		// Extension DLL one-time initialization
		if (!AfxInitExtensionModule(DllExtensionResourceDLL, hInstance))
			return 0;
 
		// Insert this DLL into the resource chain
		// NOTE: If this Extension DLL is being implicitly linked to by
		//  an MFC Regular DLL (such as an ActiveX Control)
		//  instead of an MFC application, then you will want to
		//  remove this line from DllMain and put it in a separate
		//  function exported from this Extension DLL.  The Regular DLL
		//  that uses this Extension DLL should then explicitly call that
		//  function to initialize this Extension DLL.  Otherwise,
		//  the CDynLinkLibrary object will not be attached to the
		//  Regular DLL's resource chain, and serious problems will
		//  result.
 
		new CDynLinkLibrary(DllExtensionResourceDLL);
 
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("DllExtensionResource.DLL Terminating!\n");
 
		// Terminate the library before destructors are called
		AfxTermExtensionModule(DllExtensionResourceDLL);
	}
	return 1;   // ok
}
J'ai vu sur certains forums qu'il fallait que la "regular" Dll initialise elle même les ressources de la Dll d'extension. J'ai donc, comme le conseillait l'article, inséré le code d'initialisation des ressources dans une méthode que j'ai exportée et qui est appellée dans InitInstance de la "regular" Dll:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dans Dll extension:
extern "C" MY_EXPORT void WINAPI InitYourExtDLL()
{
	// Create a new CDynLinkLibrary for this app.
	TRACE0("DllExtensionResource.DLL Initializing RESOURCES!\n");
	new CDynLinkLibrary(DllExtensionResourceDLL);
}

Dans Dll regular:
BOOL CDllRegularApp::InitInstance()
{
	CWinApp::InitInstance();

	InitYourExtDLL();

	return TRUE;
}
=> L'initialisation est bien appellée, mais toujours le même résulat: pas d'affichage de boites de dialogue.
J'ai également essayer de rajouter le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
void DllRegularWrapper::OuvreBoite()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
 
	AfficheDlgDllExtension();
}
avant l'appel de mes boites de dialogue (dans la Dll regular) ... sans succés.

Ca fait déjà plusieurs jours que je suis sur ce problème. Est ce que quelqu'un pourrait il m'aider?

Merci par avance