Использование ocx в консольном приложении - PullRequest
3 голосов
/ 20 августа 2008

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

Ответы [ 3 ]

3 голосов
/ 21 августа 2008

Разве 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. СОХРАНИТЕ ФАКСОВЫЙ ФАЙЛ, чтобы вам не приходилось повторять эти шаги каждый раз.

2 голосов
/ 22 августа 2008

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

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

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

#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;
}
1 голос
/ 23 августа 2008

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...