在控制台应用程序中使用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。 (是的,我知道这听起来很愚蠢,多多包涵)
- 运行Excel,创建一个新的文件,如果它没有这样做对你
- 按
Alt+F11
启动Visual Basic编辑器(如果您有Excel 2007年它是在“开发者”功能区选项卡的事情
现在你在快乐的Visual Basic土地是......
- 从
Tools
菜单中,选择References
- 从列表中选择您的OCX/COM对象,或者点击
Browse...
查找未注册COM的文件 - 如果您的OCX已经注册,您可以跳过此步骤。 - 从
Insert
菜单中,选择UserForm
- 在浮动
Toolbox
窗口中,右键单击并选择Additional Controls
- 在列表中找到您的OCX和打勾
- 然后,您可以从工具箱拖动OCX到用户表单
- 从
Run
菜单运行它。 测试你的OCX并玩弄它。
保存EXCEL文件,所以你不必每次重复这些步骤。
@orion多数民众赞成如此酷。从来没有这样想过。
那么@jschroedl多数民众赞成在确实很有趣。
在控制台应用程序中测试activex很有趣。但我认为它的价值不在试图走这条道路。您可以通过@jschroedl解释的方式调用方法或设置属性,也可以通过Invoke函数调用IDIspatch对象。
第一步是GetIDsByName并通过Invoke调用该函数,并且该函数的参数应该是Invoke形式参数列表中的VARIANTS数组。
一切都很好,花花公子。但一旦你从那里开始下坡活动。 Windows应用程序需要消息泵才能触发事件。在控制台上你没有一个。我沿着这条路走下去,为事件实现EventNotifier,就像使用经典C++方式实现CallBack接口一样。但是这些事件并没有达到你的实现接口。
我很确定这不能在控制台应用程序上完成。但我真的希望有人会在控制台应用程序中采用不同的事件
尽管存在无窗口的OCX模块,但此方法不起作用。 – 2014-02-04 18:06:49