首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开发ActiveX控件

开发ActiveX控件
EN

Stack Overflow用户
提问于 2009-11-18 04:42:44
回答 2查看 7.5K关注 0票数 7

我想开发一个ActiveX控件,因为我没有visual studio,所以我想知道我是否可以单独使用VisualC++速成版,或者我是否也需要Windows Platform SDK?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-18 04:58:27

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

您不需要创建Visual Studio Active X项目。您只需创建一个普通的DLL,添加适当的清单,并使用cab SDK工具对其进行CAB。

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

所以,是的,使用Visual Studio速成版就可以了。

编辑:

  • 你应该从Introduction to Active X Controls开始。CAB SDK.
  • You可以通过搜索
  • 等来轻松找到基本ActiveX控件的示例。

下面是一个名为YOURCONTROL.inf的示例清单。显然,将YOURCONTROL替换为您所称的对象,并生成您自己的GUID和版本号。这是您需要的最小清单。

代码语言:javascript
复制
[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对象注册等)。

代码语言:javascript
复制
EXPORTS
    DllCanUnloadNow             PRIVATE
    DllGetClassObject   PRIVATE
    DllRegisterServer   PRIVATE
    DllUnregisterServer PRIVATE

您还需要一个IDL文件,这样您就可以定义COM对象的调度接口,这样就可以从脚本中调用它,这样它就可以向Javascript触发事件。如下所示:

代码语言: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入口点应该如下所示:

代码语言:javascript
复制
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;
}
票数 14
EN

Stack Overflow用户

发布于 2009-11-18 04:49:25

这个2006年的Microsoft Support post将表明您可以使用VC++速成版来开发ActiveX控件:

适用于

Microsoft ActiveX模板库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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1751629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档