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

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

20.08.2008 13:22:56
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

//
// компилируем с: cl / EHsc test.cpp
//

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

ВЫЗОВ БУЛЫ 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)
{
    if (! EnumWindows (AddToTaskbarProc, (LPARAM) ptbl))
        throw "Невозможно перечислить окна в ShowTaskWindows";
}

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

int main (int, char **)
{
    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);
    }
    поймать (TCHAR * msg) {
        MessageBox (GetDesktopWindow (), msg, _T («Ошибка»), MB_OK);
    }       

    CoUninitialize ();

    вернуть 0;
}
2
22.08.2008 04:31:00

Разве 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, чтобы вам не приходилось повторять эти шаги каждый раз.

3
20.08.2008 22:46:19
Однако существуют модули OCX без окон, для которых этот метод не работает.
Felix Dombek 4.02.2014 18:06:49

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

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

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

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

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

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

1
23.08.2008 15:02:46