开发ActiveX控件

我想开发一个ActiveX控件,因为我没有自己的Visual Studio我想知道我是否可以使用自己的VisualC ++ Express版本,还是我还需要Windows平台SDK?

Solutions Collecting From Web of "开发ActiveX控件"

您不需要Visual Studio来编写Active X控件。 Active X控件只是一个以特定的方式注册的COM对象,它实现了IUnknown和IObjectSafety。

您不需要创建一个Visual Studio Active X项目。 您可以创建一个正常的DLL,添加适当的清单,并使用CAB SDK工具对其进行打包。

您不必使用ATL来编写Active X控件。 事实上,在理解IE扩展模型中的OLE接口的工作方式之前,最好不要使用它。

所以是的,你将会用Visual Studio Express。

编辑:

  • 您应该从“ 简介Active X控件”开始 。
  • 这是CAB SDK 。
  • 你应该没有问题找到基本的ActiveX控件的例子搜索谷歌等

这是一个名为YOURCONTROL.inf的示例清单。 很明显,用你打电话给你的人来代替YOURCONTROL,并生成你自己的GUID和版本号。 这是你需要的最小清单。

[version] signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] YOURCONTROL.dll=YOURCONTROL.dll [YOURCONTROL.dll] file-win32-x86=thiscab clsid={11111111-2222-3333-4444-555555555555} FileVersion=1,2,3,4567 Registerserver=yes 

您需要在项目中使用标准的.DEF文件,其中列出了COM所需的导出函数和自注册。 DllGetClassObject是COM将调用您为COM对象获取类工厂的位置。 Registerserver和Unregisterserver是你应该把你的初始状态写入注册表(例如你的COM对象注册等)的地方。

 EXPORTS DllCanUnloadNow PRIVATE DllGetClassObject PRIVATE DllRegisterserver PRIVATE DllUnregisterserver PRIVATE 

你也需要一个IDL文件,所以你可以定义你的COM对象的调度接口,所以它可以从脚本调用,所以它可以触发事件到Javascript。 像这样的东西:

 import "oaidl.idl"; import "ocidl.idl"; #include "dispids.h" // <-- define your DISPIDs here [ uuid(<<generate your own guid here>>), version(1.0), ] library YOURCONTROLLIBRARY { [ uuid(<<generate your own guid here>>), hidden ] dispinterface DYOURCONTROLEvents { properties: methods: // Add outgoing events here. [id(DISPID_SOME_EVENT)] void SomeEvent(); } [ dual, uuid(<<generate your own guid here>>) ] interface IYOURCONTROL : IDispatch { // Add methods and properties here. [id(DISPID_SOMEMETHOD)] HRESULT SomeMethod([in] BSTR bstrFoo); } [ uuid(<<generate your own guid here>>) ] coclass YOURCONTROLCtl { [default] interface IYOURCONTROL; [source, default] dispinterface DYOURCONTROLEvents; } } 

最后,你的DLL入口点应该是这样的:

 HINSTANCE g_hInstance; LONG g_nDllRefs; extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: g_hInstance = hInstance; g_nDllRefs = 0; break; case DLL_PROCESS_DETACH: break; } return true; } // Call this whenever you create your object to keep your DLL loaded. void DllAddRef() { InterlockedIncrement(&g_nDllRefs); } // Call this when your object is destroyed. void DllRelease() { InterlockedDecrement(&g_nDllRefs); } STDAPI DllCanUnloadNow() { return (g_nDllRefs == 0 ? S_OK : S_FALSE); } // This is where you create your class factory. See the IClassFactory documentation on msdn. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { HRESULT hr; if (rclsid == CLSID_YOUROBJECTCtl) { CYOUROBJECTFactory *pYOUROBJECTFactory = new CYOUROBJECTFactory; if (pYOUROBJECTFactory == NULL) { hr = E_OUTOFMEMORY; } else { hr = pYOUROBJECTFactory ->QueryInterface(riid, ppv); } } else { hr = CLASS_E_CLASSNOTAVAILABLE; } return hr; } STDAPI DllRegisterserver() { // Write your registry keys for registering your ActiveX COM Object here. return S_OK; } STDAPI DllUnregisterserver() { // Delete your registry keys here. return S_OK; } 

从2006年的Microsoft支持发布会表示您可以使用VC ++ Express版本来开发ActiveX控件:

适用于

这篇文章中的信息适用于:Microsoft ActiveX Template Library 3.0当用于
Microsoft Visual C ++ 6.0企业版
Microsoft Visual C ++ 6.0专业版
Microsoft Visual C ++,32位学习版6.0
Microsoft Visual C ++ 2005速成版
Microsoft Visual C ++ .NET 2003标准版
Microsoft Visual C ++ .NET 2002标准版

我开发使用ActiveX已经有一段时间了,但我不记得安装了Windows Platform SDK。