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

时间:2008-08-20 13:22:56

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

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

3 个答案:

答案 0 :(得分:3)

OCX不是ActiveX用户控件吗? (您将某些内容放在表单上供用户与之交互)?

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

  1. 运行Excel,如果尚未为您创建新文件
  2. Alt+F11启动Visual Basic编辑器(如果您有excel 2007,则在'开发人员'功能区选项卡上
  3. 现在你处于快乐的视觉基础......

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

答案 1 :(得分:2)

当然......这很简单。这是一个有趣的应用程序,我扔在一起。我假设你有Visual C ++。

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

要使用您的OCX进行测试,您需要#import the 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;
}

答案 2 :(得分:1)

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

那么@jschroedl确实很有趣。

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

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

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

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