Je souhaite tester rapidement un ocx. Comment est-ce que je laisse tomber cette ocx dans une application de console. J'ai trouvé quelques tutoriels dans CodeProject et mais sont incomplets.Utilisation d'un ocx dans une application console
Répondre
Bien sûr, c'est plutôt facile. Voici une application amusante que j'ai lancée ensemble. Je suppose que vous avez Visual C++.
Enregistrer pour TEST.CPP et compiler: cl.exe/EHsc test.cpp
Pour tester votre OCX vous devrez soit #import la typelib et l'utiliser est CLSID (ou tout simplement coder en dur CLSID) dans l'appel CoCreateInstance. L'utilisation de #import aidera également à définir les interfaces personnalisées dont vous pourriez avoir besoin.
#include "windows.h" #include "shobjidl.h" #include "atlbase.h" // // compile with: cl /EHsc test.cpp // // A fun little program to demonstrate creating an OCX. // (CLSID_TaskbarList in this case) // BOOL CALLBACK RemoveFromTaskbarProc(HWND hwnd, LPARAM lParam) { ITaskbarList* ptbl = (ITaskbarList*)lParam; ptbl->DeleteTab(hwnd); return TRUE; } void HideTaskWindows(ITaskbarList* ptbl) { EnumWindows(RemoveFromTaskbarProc, (LPARAM) ptbl); } // ============ BOOL CALLBACK AddToTaskbarProc(HWND hwnd, LPARAM lParam) { ITaskbarList* ptbl = (ITaskbarList*)lParam; ptbl->AddTab(hwnd); return TRUE;// continue enumerating } void ShowTaskWindows(ITaskbarList* ptbl) { if (!EnumWindows(AddToTaskbarProc, (LPARAM) ptbl)) throw "Unable to enum windows in ShowTaskWindows"; } // ============ int main(int, char**) { CoInitialize(0); try { CComPtr<IUnknown> pUnk; if (FAILED(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &pUnk))) throw "Unabled to create CLSID_TaskbarList"; // Do something with the object... CComQIPtr<ITaskbarList> ptbl = pUnk; if (ptbl) ptbl->HrInit(); HideTaskWindows(ptbl); MessageBox(GetDesktopWindow(), _T("Check out the task bar!"), _T("StackOverflow FTW"), MB_OK); ShowTaskWindows(ptbl); } catch(TCHAR * msg) { MessageBox(GetDesktopWindow(), msg, _T("Error"), MB_OK); } CoUninitialize(); return 0; }
Un OCX n'est-il pas un contrôle utilisateur ActiveX? (quelque chose que vous mettez sur un formulaire pour l'utilisateur d'interagir avec)?
Le moyen le plus simple que je connaisse pour tester COM/ActiveX est d'utiliser Excel. (Oui, je sais que cela semble stupide, ours avec moi)
- Run Excel, créez un nouveau fichier si elle n'a pas fait cela pour vous
- Appuyez sur
Alt+F11
pour lancer l'éditeur Visual Basic (si vous avez Excel 2007, il est sur l'onglet ruban « développeur » chose
maintenant que vous êtes en terrain de base heureux visuel ...
- dans le menu
Tools
, sélectionnezReferences
- Sélectionnez votre objet OCX/COM dans la liste ou cliquez sur
Browse...
pour rechercher le fichier s'il n'est pas enregistré auprès de COM - Vous pouvez ignorer cette étape si votre OCX est déjà enregistré. - Dans le menu
Insert
, sélectionnezUserForm
- Dans la fenêtre
Toolbox
flottante, faites un clic droit et sélectionnezAdditional Controls
- Trouver votre OCX dans la liste et les tiques qu'il
- Vous pouvez ensuite faire glisser votre OCX de la boîte à outils sur la userform
- Dans le menu
Run
, exécutez-le. Testez votre OCX et jouez avec. ENREGISTREZ LE FICHIER EXCEL afin de ne pas avoir à répéter ces étapes à chaque fois.
@orion est tellement cool. Je n'y ai jamais pensé de cette façon.
Eh bien @jschroedl c'était vraiment amusant.
Tester un ActiveX dans une application de console est amusant. Mais je pense que cela vaut la peine de ne pas essayer cette voie. Vous pouvez appeler les méthodes ou définir et obtenir les propriétés soit de la façon dont @jschroedl a été expliqué, soit vous pouvez appeler l'objet IDIspatch via la fonction Invoke.
La première étape est de GetIDsByName et appelez la fonction via Invoke et les paramètres de la fonction doivent être un tableau de VARIANTS dans la liste des paramètres formels Invoke.
Tout va bien et dandy. Mais une fois que vous arrivez à des événements sa descente à partir de là. L'application Windows nécessite une pompe de message pour déclencher des événements. Sur une console, vous n'en avez pas. Je suis allé sur le chemin pour implémenter un EventNotifier pour les événements tout comme vous implémentez une interface CallBack en mode C++ classique. Mais les événements ne parviennent pas à votre interface implémentée. Je suis assez sûr que cela ne peut pas être fait sur une application de la console.
Mais j'espère vraiment que quelqu'un aura une vision différente des événements dans une application de console.
Il existe cependant des modules OCX sans fenêtre pour lesquels cette méthode ne fonctionne pas. –