Question

Je veux tester rapidement un ocx.Comment puis-je supprimer cet ocx dans une application console.J'ai trouvé quelques tutoriels dans CodeProject mais ils sont incomplets.

Était-ce utile?

La solution

Bien sûr... c'est assez facile.Voici une application amusante que j'ai créée.Je suppose que vous disposez de Visual C++.

Enregistrez dans test.cpp et compilez :cl.exe /EHsc test.cpp

Pour tester avec votre OCX, vous devrez soit #importer la bibliothèque de types et utiliser son CLSID (ou simplement coder en dur le 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;
}

Autres conseils

Un OCX n'est-il pas un contrôle utilisateur ActiveX ?(quelque chose que vous mettez sur un formulaire avec lequel l'utilisateur peut interagir) ?

Le moyen le plus simple que je connaisse pour tester des éléments COM/ActiveX est d'utiliser Excel.(Oui, je sais, ça semble stupide, supporte-moi)

  1. Exécutez Excel, créez un nouveau fichier s'il ne l'a pas fait pour vous
  2. Presse Alt+F11 pour lancer Visual Basic Editor (si vous avez Excel 2007, c'est dans l'onglet du ruban "Développeur"

Maintenant que vous êtes dans le joyeux pays visuel de base...

  1. Du Tools menu, sélectionnez References
  2. Sélectionnez votre objet OCX/COM dans la liste ou cliquez sur Browse... pour trouver le fichier s'il n'est pas enregistré auprès de COM - Vous pourrez peut-être ignorer cette étape si votre OCX est déjà enregistré.
  3. Du Insert menu, sélectionnez UserForm
  4. Dans le flottant Toolbox fenêtre, faites un clic droit et sélectionnez Additional Controls
  5. Trouvez votre OCX dans la liste et cochez-le
  6. Vous pouvez ensuite faire glisser votre OCX de la boîte à outils vers le formulaire utilisateur
  7. Du Run menu, exécutez-le.
  8. Testez votre OCX et jouez avec.

  9. ENREGISTREZ LE FICHIER EXCEL afin de ne pas avoir à répéter ces étapes à chaque fois.

@orion c'est trop cool.Je n'y avais jamais pensé de cette façon.

Eh bien, @jschroedl, c'était vraiment amusant.

Tester un actifx dans une application console est amusant.Mais je pense que cela vaut la peine de ne pas s’engager dans cette voie.Vous pouvez appeler les méthodes ou définir et obtenir les propriétés soit de la manière expliquée par @jschroedl, soit appeler l'objet IDIspatch via la fonction Invoke.

La première étape consiste à GetIDsByName et à appeler 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.Mais une fois arrivé aux événements, la situation se dégrade à partir de là.L'application Windows nécessite une pompe de messages pour déclencher des événements.Sur une console, vous n'en avez pas.J'ai suivi la voie pour implémenter un EventNotifier pour les événements, tout comme vous implémentez une interface CallBack de manière classique C++.Mais les événements ne parviennent pas à votre interface implémentée.

Je suis presque sûr que cela ne peut pas être fait sur une application console.Mais j'espère vraiment que quelqu'un aura une vision différente des événements dans une application console.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top