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





Разве OCX не является пользовательским элементом управления ActiveX? (что-то, что вы помещаете в форму для взаимодействия пользователя)?
Самый простой способ протестировать COM / ActiveX, который я знаю, - это использовать excel. (Да, я знаю, это звучит глупо, терпи меня)
Alt+F11, чтобы запустить редактор Visual Basic (если у вас Excel 2007, он находится на вкладке ленты «Разработчик»Теперь, когда вы попали в счастливую страну визуальных баз ...
Tools выберите References.Browse..., чтобы найти файл, если он не зарегистрирован в COM. Вы можете пропустить этот шаг, если ваш OCX уже зарегистрирован.Insert выберите UserFormToolbox щелкните правой кнопкой мыши и выберите Additional Controls.Run запустите его.Проверьте свой OCX и поиграйте с ним.
СОХРАНИТЕ ФАЙЛ EXCEL, чтобы не повторять эти шаги каждый раз.
Конечно .. это довольно просто. Вот забавное приложение, которое я создал. Я предполагаю, что у вас есть Visual C++.
Сохраните в test.cpp и скомпилируйте: cl.exe / EHsc test.cpp
Для тестирования с вашим OCX вам нужно либо # импортировать библиотеку типов и использовать ее 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;
}
@orion это так круто. Никогда не думал об этом так.
Что ж, @jschroedl, это было действительно весело.
Тестировать ActiveX в консольном приложении - это весело. Но я думаю, что не стоит идти по этому пути. Вы можете вызвать методы или установить и получить свойства либо способом, который объяснил @jschroedl, либо вы можете вызвать объект IDIspatch через функцию Invoke.
Первым шагом является GetIDsByName и вызов функции через Invoke, а параметры функции должны быть массивом VARIANTS в списке формальных параметров Invoke.
Все хорошо и щегольски. Но как только вы дойдете до событий, все будет под гору. Приложению Windows требуется насос сообщений для запуска событий. На консоли у вас его нет. Я пошел по пути, чтобы реализовать EventNotifier для событий, точно так же, как вы реализуете интерфейс CallBack классическим способом C++. Но события не попадают в ваш реализованный интерфейс.
Я почти уверен, что это невозможно сделать в консольном приложении. Но я очень надеюсь, что у кого-то будет другой взгляд на события в консольном приложении.
Однако существуют модули OCX без окон, для которых этот метод не работает.