Разработка элементов управления ActiveX - PullRequest
7 голосов
/ 17 ноября 2009

Я хотел бы разработать элемент управления ActiveX, и, поскольку я не владею Visual Studio, мне интересно, могу ли я использовать VisualC ++ Express Edition самостоятельно или мне также нужен Windows Platform SDK?

Ответы [ 2 ]

14 голосов
/ 17 ноября 2009

Вам не нужна Visual Studio для записи элемента управления Active X. Элемент управления Active X - это просто COM-объект, который зарегистрирован особым образом, который реализует IUnknown и IObjectSafety.

Вам не нужно создавать проект Visual Studio Active X. Вы можете просто создать нормальную DLL-библиотеку, добавить соответствующий манифест и отправить его с помощью инструментов CAB SDK.

Вам не нужно использовать ATL для записи элемента управления Active X. На самом деле, вам, вероятно, лучше не использовать его, пока вы не поймете, как работают интерфейсы OLE в модели расширяемости IE.

Так что да, с Visual Studio Express у вас все будет в порядке.

РЕДАКТИРОВАТЬ:

  • Вы должны начать с Введение в Active X Controls .
  • Вот вам CAB SDK .
  • У вас не должно возникнуть проблем с поиском примеров основных элементов управления ActiveX с помощью поиска в Google и т. Д.

Вот пример манифеста, который называется 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;
}
0 голосов
/ 17 ноября 2009

В этом сообщении службы поддержки Microsoft от 2006 года будет указано, что вы можете использовать выпуск VC ++ Express для разработки элементов управления ActiveX:

ОТНОСИТСЯ К

Microsoft ActiveX Template Library 3.0, при использовании с:
Microsoft Visual C ++ 6.0 Enterprise Edition
Microsoft Visual C ++ 6.0 Professional Edition
Microsoft Visual C ++, 32-разрядная версия обучения 6.0
Microsoft Visual C ++ 2005 Express Edition
Microsoft Visual C ++ .NET 2003 Standard Edition
Microsoft Visual C ++ .NET 2002 Standard Edition

Прошло много времени с тех пор, как я разрабатывал с использованием ActiveX, но я не помню, чтобы мне был установлен Windows Platform SDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...