3

我想快速测试一个ocx。如何在控制台应用程序中删除该 ocx。我在 CodeProject 中找到了一些教程,但不完整。

4

3 回答 3

3

OCX 不是 ActiveX 用户控件吗?(您放在表单上供用户交互的东西)?

我所知道的测试 COM/ActiveX 的最简单方法是使用 excel。(是的,我知道这听起来很愚蠢,请耐心等待)

  1. 运行 Excel,如果它没有为您完成此操作,请创建一个新文件
  2. 按下Alt+F11以启动 Visual Basic 编辑器(如果您有 excel 2007,它位于“开发人员”功能区选项卡上

现在你在快乐的视觉基础领域......

  1. Tools菜单中,选择References
  2. 从列表中选择您的 OCX/COM 对象,Browse...如果该文件未向 COM 注册,则单击以查找该文件 - 如果您的 OCX 已注册,您可以跳过此步骤。
  3. Insert菜单中,选择UserForm
  4. 在浮动Toolbox窗口中,右键单击并选择Additional Controls
  5. 在列表中找到您的 OCX 并打勾
  6. 然后,您可以将您的 OCX 从工具箱拖到用户窗体上
  7. Run菜单中运行它。
  8. 测试您的 OCX 并使用它。

  9. 保存 EXCEL 文件,这样您就不必每次都重复这些步骤。

于 2008-08-20T22:46:19.743 回答
2

当然..这很容易。这是我拼凑的一个有趣的应用程序。我假设你有 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;
}
于 2008-08-22T04:31:00.810 回答
1

@orion 太酷了。从来没有这样想过。

嗯@jschroedl 那确实很有趣。

在控制台应用程序中测试 activex 很有趣。但我认为不值得尝试这条路。您可以通过@jschroedl 解释的方式调用方法或设置和获取属性,也可以通过 Invoke 函数调用 IDIspatch 对象。

第一步是 GetIDsByName 并通过 Invoke 调用函数,函数的参数应该是 Invoke 形参列表中的 VARIANTS 数组。

一切都很好,花花公子。但是,一旦您参加活动,它就会从那里走下坡路。Windows 应用程序需要消息泵来触发事件。在控制台上你没有。我沿着路径为事件实现 EventNotifier,就像您以经典 C++ 方式实现 CallBack 接口一样。但是事件不会到达您实现的界面。

我很确定这不能在控制台应用程序上完成。但我真的希望有人在控制台应用程序中对事件有不同的看法

于 2008-08-23T15:02:46.743 回答