Вопрос

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

Это было полезно?

Решение

Sure..it это довольно просто.Вот забавное приложение, которое я собрал вместе.Я предполагаю, что у вас есть 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;
}

Другие советы

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

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

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

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

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

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

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

Первым шагом является получение DSBYNAME и вызов функции через Invoke, а параметрами функции должен быть массив ВАРИАНТОВ в списке формальных параметров Invoke.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top