我想快速测试一个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 接口一样。但是事件不会到达您实现的界面。
我很确定这不能在控制台应用程序上完成。但我真的希望有人在控制台应用程序中对事件有不同的看法