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

问题描述:

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

当然,这很容易。这里有一个有趣的应用程序,我扔在一起。我假设你有Visual C++。

保存到TEST.CPP和编译:cl.exe时/ EHSC TEST.CPP

当您OCX测试你需要任何的#import类型库,并使用它的CLSID(或只是硬编码的CLSID)在CoCreateInstance调用中。使用#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("* FTW"), MB_OK); 
     ShowTaskWindows(ptbl); 
    } 
    catch(TCHAR * msg) { 
     MessageBox(GetDesktopWindow(), msg, _T("Error"), MB_OK); 
    }  

    CoUninitialize(); 

    return 0; 
} 

是不是一个ActiveX用户控件的OCX? (你放在表单上供用户进行交互的东西)?

我知道测试COM/ActiveX的最简单方法就是使用excel。 (是的,我知道这听起来很愚蠢,多多包涵)

  1. 运行Excel,创建一个新的文件,如果它没有这样做对你
  2. Alt+F11启动Visual Basic编辑器(如果您有Excel 2007年它是在“开发者”功能区选项卡的事情

现在你在快乐的Visual Basic土地是......

  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文件,所以你不必每次重复这些步骤。

+0

尽管存在无窗口的OCX模块,但此方法不起作用。 – 2014-02-04 18:06:49

@orion多数民众赞成如此酷。从来没有这样想过。

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

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

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

一切都很好,花花公子。但一旦你从那里开始下坡活动。 Windows应用程序需要消息泵才能触发事件。在控制台上你没有一个。我沿着这条路走下去,为事件实现EventNotifier,就像使用经典C++方式实现CallBack接口一样。但是这些事件并没有达到你的实现接口。

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