Сведения о вопросе

profi

10:12, 2nd August, 2020

Теги

c++   visual-c++   console   activex    

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

Просмотров: 485   Ответов: 3

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



  Сведения об ответе

qwerty101

21:06, 1st October, 2020

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

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

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

Теперь, когда вы находитесь в счастливой стране visual basic...

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


  Сведения об ответе

SKY

15:07, 25th August, 2020

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

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

Для тестирования с вашим OCX вам нужно будет либо #import 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;
}


  Сведения об ответе

lourence

14:34, 29th August, 2020

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

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться