Domanda

Voglio testare rapidamente un ocx.Come faccio a rilasciare l'OCX in un'applicazione console.Ho trovato alcuni tutorial in CodeProject ma sono incompleti.

È stato utile?

Soluzione

Certo... è abbastanza facile.Ecco un'app divertente che ho messo insieme.Presumo che tu abbia Visual C++.

Salva su test.cpp e compila:cl.exe /EHsc test.cpp

Per testare con il tuo OCX dovrai #importare la libreria dei tipi e utilizzare il suo CLSID (o semplicemente codificare il CLSID) nella chiamata CoCreateInstance.L'uso di #import aiuterà anche a definire eventuali interfacce personalizzate di cui potresti aver bisogno.

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

Altri suggerimenti

Un OCX non è un controllo utente ActiveX?(qualcosa che inserisci in un modulo con cui l'utente può interagire)?

Il modo più semplice che conosco per testare elementi COM/ActiveX è utilizzare Excel.(Sì, lo so, sembra stupido, abbi pazienza)

  1. Esegui Excel, crea un nuovo file se non lo ha fatto per te
  2. Premere Alt+F11 per avviare Visual Basic Editor (se hai Excel 2007 è nella scheda della barra multifunzione "Sviluppatore"

Ora che sei nel felice mondo di Visual Basic...

  1. Dal Tools menu, selezionare References
  2. Seleziona l'oggetto OCX/COM dall'elenco oppure fai clic su Browse... per trovare il file se non è registrato con COM - Potresti riuscire a saltare questo passaggio se il tuo OCX è già registrato.
  3. Dal Insert menu, selezionare UserForm
  4. Nel galleggiante Toolbox finestra, fare clic con il tasto destro e selezionare Additional Controls
  5. Trova il tuo OCX nell'elenco e selezionalo
  6. Puoi quindi trascinare il tuo OCX dalla casella degli strumenti al modulo utente
  7. Dal Run menu, eseguilo.
  8. Metti alla prova il tuo OCX e gioca con esso.

  9. SALVA IL FILE EXCEL in modo da non dover ripetere questi passaggi ogni volta.

@orion è fantastico.Non lo ho mai pensato in quel modo.

Beh, @jschroedl è stato davvero divertente.

Testare un activex nell'app console è divertente.Ma penso che valga la pena non tentare questa strada.Puoi chiamare i metodi o impostare e ottenere le proprietà tramite il modo spiegato da @jschroedl oppure puoi chiamare l'oggetto IDIspatch tramite la funzione Invoke.

Il primo passaggio consiste nel GetIDsByName e chiamare la funzione tramite Invoke e i parametri della funzione devono essere un array di VARIANTS nell'elenco dei parametri formali Invoke.

Va tutto bene e dandy.Ma una volta arrivati ​​agli eventi, da lì in poi la discesa è tutta.L'applicazione Windows richiede un message pump per attivare gli eventi.Su una console non ne hai uno.Ho seguito il percorso per implementare un EventNotifier per gli eventi proprio come si implementa un'interfaccia CallBack nel classico modo C++.Ma gli eventi non arrivano all'interfaccia implementata.

Sono abbastanza sicuro che questo non possa essere fatto su un'applicazione console.Ma spero davvero che qualcuno là fuori abbia una visione diversa degli eventi in un'applicazione console

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top