【问题标题】:Using an ocx in a console application在控制台应用程序中使用 ocx
【发布时间】:2010-09-06 06:50:41
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-c++ console activex


    【解决方案1】:

    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 文件,这样您就不必每次都重复这些步骤。

    【讨论】:

    • 有一些无窗口的 OCX 模块,但是这种方法不适用。
    【解决方案2】:

    当然..这很容易。这是我拼凑的一个有趣的应用程序。我假设你有 Visual C++。

    保存到test.cpp并编译:cl.exe /EHsc test.cpp

    要使用您的 OCX 进行测试,您需要 #import 类型库并在 CoCreateInstance 调用中使用它的 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 朋克; if (FAILED(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &pUnk))) throw "无法创建 CLSID_TaskbarList"; // 对对象做一些事情... CComQIPtr ptbl = pUnk; 如果 (ptbl) ptbl->HrInit(); 隐藏任务窗口(ptbl); MessageBox(GetDesktopWindow(), _T("查看任务栏!"), _T("StackOverflow FTW"), MB_OK); ShowTaskWindows(ptbl); } 捕捉(TCHAR *味精){ MessageBox(GetDesktopWindow(), msg, _T("错误"), MB_OK); } 联合初始化(); 返回0; }

    【讨论】:

      【解决方案3】:

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

      @jschroedl 确实很有趣。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多