在控制台应用程序中使用 ocx
-
09-06-2019 - |
题
我想快速测试一个ocx。如何将该 ocx 放入控制台应用程序中。我在 CodeProject 中找到了一些教程,但不完整。
解决方案
当然..这很容易。这是我整理的一个有趣的应用程序。我假设你有 Visual C++。
保存到test.cpp并编译:cl.exe /EHsc 测试.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; }
其他提示
OCX 不是 ActiveX 用户控件吗?(您放在表单上供用户交互的东西)?
据我所知,测试 COM/ActiveX 内容的最简单方法是使用 Excel。(是的,我知道这听起来很愚蠢,请耐心等待)
- 运行 Excel,如果它没有为您完成此操作,则创建一个新文件
- 按
Alt+F11
启动 Visual Basic 编辑器(如果您有 excel 2007,它位于“开发人员”功能区选项卡上
现在你已经进入了快乐的视觉基础世界......
- 来自
Tools
菜单,选择References
- 从列表中选择 OCX/COM 对象,或单击
Browse...
如果该文件未在 COM 中注册,则查找该文件 - 如果您的 OCX 已注册,您可以跳过此步骤。 - 来自
Insert
菜单,选择UserForm
- 在漂浮的
Toolbox
窗口,右键单击并选择Additional Controls
- 在列表中找到您的 OCX 并勾选它
- 然后您可以将 OCX 从工具箱拖到用户窗体上
- 来自
Run
菜单,运行它。 测试你的 OCX 并使用它。
保存 Excel 文件,这样您就不必每次都重复这些步骤。
@orion 那太酷了。从来没有这样想过。
嗯@jschroedl 那确实很有趣。
在控制台应用程序中测试 activex 很有趣。但我认为不值得尝试这条路。您可以通过 @jschroedl 解释的方式调用方法或设置和获取属性,也可以通过 Invoke 函数调用 IDIspatch 对象。
第一步是 GetIDsByName 并通过 Invoke 调用函数,函数的参数应该是 Invoke 形参列表中的 VARIANTS 数组。
一切都很好,花花公子。但一旦你参加了活动,事情就开始走下坡路了。Windows 应用程序需要消息泵来触发事件。在控制台上你没有。我沿着路径为事件实现 EventNotifier,就像以经典 C++ 方式实现 CallBack 接口一样。但事件不会到达您实现的接口。
我很确定这不能在控制台应用程序上完成。但我真的希望有人会对控制台应用程序中的事件有不同的看法