2008-08-20 8 views

Répondre

2

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; 
} 
3

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)

  1. Run Excel, créez un nouveau fichier si elle n'a pas fait cela pour vous
  2. 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 ...

  1. dans le menu Tools, sélectionnez References
  2. 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é.
  3. Dans le menu Insert, sélectionnez UserForm
  4. Dans la fenêtre Toolbox flottante, faites un clic droit et sélectionnez Additional Controls
  5. Trouver votre OCX dans la liste et les tiques qu'il
  6. Vous pouvez ensuite faire glisser votre OCX de la boîte à outils sur la userform
  7. Dans le menu Run, exécutez-le.
  8. Testez votre OCX et jouez avec. ENREGISTREZ LE FICHIER EXCEL afin de ne pas avoir à répéter ces étapes à chaque fois.

+0

Il existe cependant des modules OCX sans fenêtre pour lesquels cette méthode ne fonctionne pas. –

1

@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.

Questions connexes