在控制台应用程序中使用ocx

时间:2020-03-05 18:41:05  来源:igfitidea点击:

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

解决方案

回答

OCX不是ActiveX用户控件吗? (我们放置在表单上以便用户与之交互的内容)?

我知道测试COM / ActiveX东西最简单的方法是使用excel。 (是的,我知道这听起来很蠢,请忍受我)

  • 运行Excel,如果尚未完成此操作,则创建一个新文件
  • 按Alt + F11键启动Visual Basic编辑器(如果我们具有excel 2007,则在"开发人员"功能区选项卡上

现在我们处在视觉基本的幸福世界中...

  • 从"工具"菜单中,选择"参考"。
  • 从列表中选择OCX / COM对象,或者单击"浏览..."以查找文件(如果未向COM注册)-如果已注册OCX,则可以跳过此步骤。
  • 从"插入"菜单中,选择"用户窗体"
  • 在浮动的"工具箱"窗口中,右键单击并选择"其他控件"
  • 在列表中找到OCX并勾选
  • 然后,我们可以将OCX从工具箱拖到用户窗体上
  • 从"运行"菜单中运行它。
  • 测试OCX并试用它。
  • 保存EXCEL文件,因此我们不必每次都重复这些步骤。

回答

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

保存到test.cpp并编译:cl.exe / EHsc test.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;
}

回答

@orion那真是太酷了。从来没有那样想过。

@jschroedl多数民众赞成确实很有趣。

在控制台应用程序中测试Activex很有趣。但是我认为值得一试。我们可以通过@jschroedl解释的方式调用方法或者设置并获取属性,也可以通过Invoke函数调用IDIspatch对象。

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

一切都很好,花花公子。但是一旦我们开始从那里下坡的事件。 Windows应用程序需要消息泵来触发事件。在控制台上,我们没有一个。我走的是为事件实现EventNotifier的方法,就像我们以经典的C ++方式实现CallBack接口一样。但是事件不会进入我们实现的界面。

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