Afficher boîte de dialogue de MFC DLL
-
28-10-2019 - |
Question
Je chargé la forme mais seulement des boutons sans fonctions
HMODULE hModule = LoadLibrary(L"Tools.dll");
if (hModule != NULL)
{
AfxSetResourceHandle(hModule);
CDialog dgl(MAKEINTRESOURCE(199), NULL);
dgl.DoModal();
}
Alors, comment je peux charger une fonction complète de la forme et je n'ai pas le code source DLL
La solution
Ceci est possible que si vous êtes sûr que la mise en œuvre de la classe de dialogue MFC basée et la classe est exportée à partir Tools.dll. Vous pouvez vérifier votre .dll avec Dependency Walker utilitaire.
S'il vous plaît noter le compilateur Mangles nom du constructeur. Voilà ce que je suis arrivé à la déclaration suivante.
class __declspec(dllexport) TestDialog : public CDialog
{
public:
TestDialog()
:CDialog(10)
{
}
};
Mangled Nom du constructeur: ?? _ 7TestDialog @@ 6B @
Probablement vous serez en mesure de recréer en-tête de classe de dialogue sur la base des résultats de votre inspection. Vous devez également vous assurer que vous avez la même version de MFC aussi bien pour Tools.dll et votre application.
Autres conseils
Pour afficher la boîte de dialogue de MFC dll
, comme scénario - vous avez fonction exportée dans la DLL et de cette fonction que vous appelez DoModel()
.This TEMPLATE réellement stockées dans le besoin DLL module.You à l'état du module de commutation pour poignée courant used.You être peut faire en utilisant:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AFX_MODULE_STATE AfxGetStaticModuleState()
-> structure de The AFX_MODULE_STATE
contient des données globales pour le module, qui est la partie de l'état du module qui est poussé ou sauté.
IN Code DLL sera comme ceci:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg objMyDlg;
iRet = objMyDlg.DoModal();