我想快速测试一个ocx。如何在控制台应用程序中删除该ocx。我在CodeProject中找到了一些教程但是不完整。
答案 0 :(得分:3)
OCX不是ActiveX用户控件吗? (您将某些内容放在表单上供用户与之交互)?
我知道测试COM / ActiveX的最简单方法是使用excel。 (是的,我知道这听起来很愚蠢,请耐心等待)
Alt+F11
启动Visual Basic编辑器(如果您有excel 2007,则在'开发人员'功能区选项卡上现在你处于快乐的视觉基础......
Tools
菜单中,选择References
Browse...
以查找未在COM中注册的文件 - 如果您的OCX已经注册,则可以跳过此步骤。Insert
菜单中,选择UserForm
Toolbox
窗口中,右键单击并选择Additional Controls
Run
菜单中运行它。测试你的OCX并玩弄它。
保存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接口一样。但事件并没有到达您实现的界面。
我很确定这不能在控制台应用程序上完成。但我真的希望有人在控制台应用程序中对事件有不同的看法