Использование ocx в консольном приложении

Я хочу быстро протестировать ocx. Как мне удалить этот ocx в консольном приложении. Я нашел несколько руководств в CodeProject, но они неполные.

Ответов (3)

Решение

Конечно .. это довольно просто. Вот забавное приложение, которое я создал. Я предполагаю, что у вас есть Visual C++.

Сохраните в test.cpp и скомпилируйте: cl.exe / EHsc test.cpp

Для тестирования с вашим OCX вам нужно либо # импортировать библиотеку типов и использовать ее CLSID (или просто жестко запрограммировать CLSID) в вызове CoCreateInstance. Использование #import также поможет определить любые пользовательские интерфейсы, которые могут вам понадобиться.

#include "windows.h"
#include "shobjidl.h"
#include "atlbase.h"

//
// компилировать с помощью: cl / EHsc test.cpp
//

// Маленькая забавная программа для демонстрации создания OCX.
// (в данном случае CLSID_TaskbarList)
//

BOOL CALLBACK RemoveFromTaskbarProc (HWND hwnd, LPARAM lParam)
{
    ITaskbarList * ptbl = (ITaskbarList *) lParam;
    ptbl-> DeleteTab (hwnd);  
    вернуть ИСТИНА;
}

void HideTaskWindows (ITaskbarList * ptbl)
{
    EnumWindows (RemoveFromTaskbarProc, (LPARAM) ptbl);
}

// ============

BOOL CALLBACK AddToTaskbarProc (HWND hwnd, LPARAM lParam)
{
    ITaskbarList * ptbl = (ITaskbarList *) lParam;
    ptbl-> AddTab (hwnd); 

    return TRUE; // продолжаем перечисление
}

void ShowTaskWindows (ITaskbarList * ptbl)
{
    если (! EnumWindows (AddToTaskbarProc, (LPARAM) ptbl))
        throw «Невозможно перечислить окна в ShowTaskWindows»;
}

// ============

int main (число, символ **)
{
    CoInitialize (0);

    пытаться {
        CComPtr <IUnknown> pUnk;

        if (FAILED (CoCreateInstance (CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **) & pUnk)))
            throw "Невозможно создать CLSID_TaskbarList";


        // Что-то делаем с объектом ...

        CComQIPtr <ITaskbarList> ptbl = pUnk;
        если (ptbl)
            ptbl-> HrInit ();

        HideTaskWindows (ptbl);
        MessageBox (GetDesktopWindow (), _T («Проверьте панель задач!»), _T («StackOverflow FTW»), MB_OK);
        ShowTaskWindows (ptbl);
    }
    catch (TCHAR * msg) {
        MessageBox (GetDesktopWindow (), msg, _T ("Ошибка"), MB_OK);
    }       

    CoUninitialize ();

    возврат 0;
}

Разве OCX не является пользовательским элементом управления ActiveX? (что-то, что вы помещаете в форму для взаимодействия пользователя)?

Самый простой способ протестировать COM / ActiveX, который я знаю, - это использовать excel. (Да, я знаю, это звучит глупо, терпи меня)

  1. Запустите Excel, создайте новый файл, если он этого не сделал за вас
  2. Нажмите, Alt+F11чтобы запустить редактор Visual Basic (если у вас Excel 2007, он находится на вкладке ленты «Разработчик»

Теперь, когда вы попали в счастливую страну визуальных баз ...

  1. В Toolsменю выберитеReferences
  2. Выберите свой объект OCX / COM из списка или щелкните, Browse...чтобы найти файл, если он не зарегистрирован в COM - вы можете пропустить этот шаг, если ваш OCX уже зарегистрирован.
  3. В Insertменю выберитеUserForm
  4. В плавающем Toolboxокне щелкните правой кнопкой мыши и выберитеAdditional Controls
  5. Найдите свой OCX в списке и отметьте его галочкой
  6. Затем вы можете перетащить свой OCX из панели инструментов в пользовательскую форму.
  7. Из Runменю запустите его.
  8. Проверьте свой OCX и поиграйте с ним.

  9. СОХРАНИТЕ ФАЙЛ EXCEL, чтобы не повторять эти шаги каждый раз.

@orion это так круто. Никогда не думал об этом так.

Что ж, @jschroedl, это было действительно весело.

Тестировать ActiveX в консольном приложении - это весело. Но я думаю, что не стоит идти по этому пути. Вы можете вызвать методы или установить и получить свойства либо способом, который объяснил @jschroedl, либо вы можете вызвать объект IDIspatch через функцию Invoke.

Первым шагом является GetIDsByName и вызов функции через Invoke, а параметры функции должны быть массивом VARIANTS в списке формальных параметров Invoke.

Все нормально и щегольски. Но как только вы дойдете до событий, все будет под гору. Приложению Windows требуется насос сообщений для запуска событий. На консоли у вас его нет. Я пошел по пути, чтобы реализовать EventNotifier для событий, точно так же, как вы реализуете интерфейс CallBack классическим способом C++. Но события не попадают в ваш реализованный интерфейс.

Я почти уверен, что это невозможно сделать в консольном приложении. Но я очень надеюсь, что у кого-то будет другой взгляд на события в консольном приложении.