在控制台应用程序中使用ocx
时间:2020-03-05 18:41:05 来源:igfitidea点击:
我想快速测试ocx。如何在控制台应用程序中删除该ocx。我在CodeProject中找到了一些教程,但并不完整。
解决方案
回答
OCX不是ActiveX用户控件吗? (我们放置在表单上以便用户与之交互的内容)?
我知道测试COM / ActiveX东西最简单的方法是使用excel。 (是的,我知道这听起来很蠢,请忍受我)
- 运行Excel,如果尚未完成此操作,则创建一个新文件
- 按Alt + F11键启动Visual Basic编辑器(如果我们具有excel 2007,则在"开发人员"功能区选项卡上
现在我们处在视觉基本的幸福世界中...
- 从"工具"菜单中,选择"参考"。
- 从列表中选择OCX / COM对象,或者单击"浏览..."以查找文件(如果未向COM注册)-如果已注册OCX,则可以跳过此步骤。
- 从"插入"菜单中,选择"用户窗体"
- 在浮动的"工具箱"窗口中,右键单击并选择"其他控件"
- 在列表中找到OCX并勾选
- 然后,我们可以将OCX从工具箱拖到用户窗体上
- 从"运行"菜单中运行它。
- 测试OCX并试用它。
- 保存EXCEL文件,因此我们不必每次都重复这些步骤。
回答
当然..这很容易。这是我一起玩的一个有趣的应用程序。我假设我们有Visual C ++。
保存到test.cpp并编译:cl.exe / EHsc test.cpp
要使用OCX进行测试,我们需要#import typelib并在CoCreateInstance调用中使用它的CLSID(或者仅硬编码CLSID)。使用#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解释的方式调用方法或者设置并获取属性,也可以通过Invoke函数调用IDIspatch对象。
第一步是GetIDsByName并通过Invoke调用该函数,并且该函数的参数应该是Invoke形式参数列表中的VARIANTS数组。
一切都很好,花花公子。但是一旦我们开始从那里下坡的事件。 Windows应用程序需要消息泵来触发事件。在控制台上,我们没有一个。我走的是为事件实现EventNotifier的方法,就像我们以经典的C ++方式实现CallBack接口一样。但是事件不会进入我们实现的界面。
我很确定这不能在控制台应用程序上完成。但是我真的希望有人会在控制台应用程序中对事件有不同的看法