我想快速测试一个ocx。如何在控制台应用程序中删除该 ocx。我在 CodeProject 中找到了一些教程,但不完整。
3 回答
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 文件,这样您就不必每次都重复这些步骤。
当然..这很容易。这是我拼凑的一个有趣的应用程序。我假设你有 Visual C++。
保存到test.cpp并编译:cl.exe /EHsc test.cpp
要使用您的 OCX 进行测试,您需要在 CoCreateInstance 调用中 #import 类型库并使用它的 CLSID(或只是硬编码 CLSID)。使用#import 还有助于定义您可能需要的任何自定义接口。
#include "windows.h" #include “shobjidl.h” #include “atlbase.h” // // 编译:cl /EHsc test.cpp // // 一个有趣的小程序来演示如何创建 OCX。 //(在这种情况下为 CLSID_TaskbarList) // BOOL CALLBACK RemoveFromTaskbarProc(HWND hwnd, LPARAM lParam) { ITaskbarList* ptbl = (ITaskbarList*)lParam; ptbl->删除选项卡(hwnd); 返回真; } 无效 HideTaskWindows(ITaskbarList* ptbl) { EnumWindows(RemoveFromTaskbarProc, (LPARAM) ptbl); } // ============= BOOL CALLBACK AddToTaskbarProc(HWND hwnd, LPARAM lParam) { ITaskbarList* ptbl = (ITaskbarList*)lParam; ptbl->AddTab(hwnd); return TRUE;// 继续枚举 } 无效 ShowTaskWindows(ITaskbarList* ptbl) { if (!EnumWindows(AddToTaskbarProc, (LPARAM) ptbl)) 抛出“无法在 ShowTaskWindows 中枚举窗口”; } // ============= int main(int, char**) { 共同初始化(0); 尝试 { CComPtr<IUnknown> 朋克; if (FAILED(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &pUnk))) throw "无法创建 CLSID_TaskbarList"; // 对对象做一些事情... CComQIPtr<ITaskbarList> ptbl = pUnk; 如果 (ptbl) ptbl->HrInit(); 隐藏任务窗口(ptbl); MessageBox(GetDesktopWindow(), _T("查看任务栏!"), _T("StackOverflow FTW"), MB_OK); ShowTaskWindows(ptbl); } 捕捉(TCHAR *味精){ MessageBox(GetDesktopWindow(), msg, _T("错误"), MB_OK); } 联合初始化(); 返回0; }
@orion 太酷了。从来没有这样想过。
嗯@jschroedl 那确实很有趣。
在控制台应用程序中测试 activex 很有趣。但我认为不值得尝试这条路。您可以通过@jschroedl 解释的方式调用方法或设置和获取属性,也可以通过 Invoke 函数调用 IDIspatch 对象。
第一步是 GetIDsByName 并通过 Invoke 调用函数,函数的参数应该是 Invoke 形参列表中的 VARIANTS 数组。
一切都很好,花花公子。但是,一旦您参加活动,它就会从那里走下坡路。Windows 应用程序需要消息泵来触发事件。在控制台上你没有。我沿着路径为事件实现 EventNotifier,就像您以经典 C++ 方式实现 CallBack 接口一样。但是事件不会到达您实现的界面。
我很确定这不能在控制台应用程序上完成。但我真的希望有人在控制台应用程序中对事件有不同的看法