Использование ocx в консольном приложении
-
09-06-2019 - |
Вопрос
Я хочу быстро протестировать 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.(Да, я знаю, это звучит глупо, потерпи меня)
- Запустите Excel, создайте новый файл, если он еще не сделал этого за вас
- Пресса
Alt+F11
чтобы запустить редактор Visual Basic (если у вас Excel 2007, он находится на вкладке ленты "Разработчик"
Теперь, когда вы находитесь в счастливой стране Visual Basic...
- Из самого
Tools
меню, выберитеReferences
- Выберите нужный OCX / COM-объект из списка или нажмите
Browse...
чтобы найти файл, если он не зарегистрирован в COM - Вы можете пропустить этот шаг, если ваш OCX уже зарегистрирован. - Из самого
Insert
меню, выберитеUserForm
- В плавающем
Toolbox
окне, щелкните правой кнопкой мыши и выберитеAdditional Controls
- Найдите свой OCX в списке и отметьте его галочкой
- Затем вы можете перетащить свой OCX-файл из панели инструментов в пользовательскую форму
- Из самого
Run
меню, запустите его. Протестируйте свой OCX и поиграйте с ним.
СОХРАНИТЕ ФАЙЛ EXCEL, чтобы вам не приходилось повторять эти действия каждый раз.
@орион, это так круто.Никогда не думал об этом с такой точки зрения.
Что ж, @jschroedl, это действительно было весело.
Тестировать activex в консольном приложении - это весело.Но я думаю, что не стоит идти по этому пути.Вы можете вызвать методы или установить и получить свойства либо способом, описанным @jschroedl, либо вы можете вызвать объект IDispatch через функцию Invoke.
Первым шагом является получение DSBYNAME и вызов функции через Invoke, а параметрами функции должен быть массив ВАРИАНТОВ в списке формальных параметров Invoke.
Все прекрасно и денди.Но как только вы доберетесь до событий, все пойдет под откос.Приложению Windows требуется перекачка сообщений для запуска событий.На консоли у вас его нет.Я пошел по пути реализации EventNotifier для событий точно так же, как вы реализуете интерфейс обратного вызова классическим способом C ++.Но события не попадают в ваш реализованный интерфейс.
Я почти уверен, что это невозможно сделать в консольном приложении.Но я действительно надеюсь, что у кого-то там будет другой взгляд на события в консольном приложении