Pergunta

Quero testar rapidamente um ocx.Como faço para descartar esse ocx em um aplicativo de console.Encontrei alguns tutoriais no CodeProject mas estão incompletos.

Foi útil?

Solução

Claro ... é muito fácil.Aqui está um aplicativo divertido que criei.Presumo que você tenha Visual C++.

Salve em test.cpp e compile:cl.exe /EHsc test.cpp

Para testar com seu OCX, você precisará #importar o typelib e usar seu CLSID (ou apenas codificar o CLSID) na chamada CoCreateInstance.Usar #import também ajudará a definir quaisquer interfaces personalizadas que você possa precisar.

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

Outras dicas

Um OCX não é um controle de usuário ActiveX?(algo que você coloca em um formulário para o usuário interagir)?

A maneira mais fácil que conheço de testar coisas COM/ActiveX é usar o Excel.(Sim, eu sei que parece idiota, tenha paciência comigo)

  1. Execute o Excel, crie um novo arquivo se ainda não tiver feito isso para você
  2. Imprensa Alt+F11 para iniciar o Editor do Visual Basic (se você tiver o Excel 2007, ele estará na aba 'Desenvolvedor'

Agora que você está na terra feliz do visual basic...

  1. De Tools menu, selecione References
  2. Selecione seu objeto OCX/COM na lista ou clique em Browse... para encontrar o arquivo se ele não estiver registrado no COM - Você poderá pular esta etapa se o seu OCX já estiver registrado.
  3. De Insert menu, selecione UserForm
  4. Na flutuação Toolbox janela, clique com o botão direito e selecione Additional Controls
  5. Encontre seu OCX na lista e marque-o
  6. Você pode então arrastar seu OCX da caixa de ferramentas para o formulário do usuário
  7. De Run menu, execute-o.
  8. Teste seu OCX e brinque com ele.

  9. SALVE O ARQUIVO EXCEL para não ter que repetir essas etapas todas as vezes.

@orion isso é tão legal.Nunca pensei nisso dessa forma.

Bem, @jschroedl, isso foi realmente divertido.

Testar um activex no aplicativo de console é divertido.Mas acho que vale a pena não tentar seguir esse caminho.Você pode chamar os métodos ou definir e obter as propriedades da maneira que @jschroedl explicou ou pode chamar o objeto IDIspatch por meio da função Invoke.

A primeira etapa é GetIDsByName e chamar a função por meio de Invoke e os parâmetros da função devem ser uma matriz de VARIANTS na lista de parâmetros formais de Invoke.

Está tudo bem e elegante.Mas quando você chega aos eventos, a partir daí é uma ladeira abaixo.O aplicativo Windows requer uma bomba de mensagem para disparar eventos.Em um console você não tem um.Segui o caminho para implementar um EventNotifier para os eventos, assim como você implementa uma interface CallBack no modo C++ clássico.Mas os eventos não chegam à interface implementada.

Tenho certeza de que isso não pode ser feito em um aplicativo de console.Mas eu realmente espero que alguém tenha uma visão diferente dos eventos em um aplicativo de console

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top