Разработка элементов управления ActiveX

Только для ясности: GZip не является алгоритмом только для MS, как предложил Парень Старбак в его комментарии с августа. GZipStream в Системе. IO.Compression использует Выкачивать алгоритм, все равно как zlib библиотека и много других инструментов zip. Тот класс полностью совместим с утилитами Unix как gzip.

класс GZipStream не scriptable от командной строки или VBScript, для создания zip-файлов, таким образом, это один не был бы ответ запрос исходного плаката.

свободное библиотека DotNetZip действительно читает и производит zip-файлы и может быть задана сценарием от VBScript или Powershell. Это также включает инструменты командной строки, чтобы произвести и читать/извлекать zip-файлы.

Вот некоторый код для VBScript:

dim filename 
filename = "C:\temp\ZipFile-created-from-VBScript.zip"

WScript.echo("Instantiating a ZipFile object...")
dim zip 
set zip = CreateObject("Ionic.Zip.ZipFile")

WScript.echo("using AES256 encryption...")
zip.Encryption = 3

WScript.echo("setting the password...")
zip.Password = "Very.Secret.Password!"

WScript.echo("adding a selection of files...")
zip.AddSelectedFiles("*.js")
zip.AddSelectedFiles("*.vbs")

WScript.echo("setting the save name...")
zip.Name = filename

WScript.echo("Saving...")
zip.Save()

WScript.echo("Disposing...")
zip.Dispose()

WScript.echo("Done.")

Вот некоторый код для Powershell:

[System.Reflection.Assembly]::LoadFrom("c:\\dinoch\\bin\\Ionic.Zip.dll");

$directoryToZip = "c:\\temp";
$zipfile =  new-object Ionic.Zip.ZipFile;
$e= $zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.")
$e= $zipfile.AddDirectory($directoryToZip, "home")
$zipfile.Save("ZipFiles.ps1.out.zip");

В .bat или .cmd файле, можно использовать инструменты zipit.exe или unzip.exe. Например:

zipit NewZip.zip  -s "This is string content for an entry"  Readme.txt  src 

7
задан Matt 17 November 2009 в 20:42
поделиться

2 ответа

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

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

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

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

EDIT:

Вот образец манифеста, который называется 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-объекта, чтобы его можно было вызывать из script, и поэтому он может запускать события в 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;
}
14
ответ дан 6 December 2019 в 15:23
поделиться

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

ПРИМЕНЯЕТСЯ К

Библиотеке шаблонов Microsoft ActiveX 3.0 , при использовании с:
Microsoft Visual C ++ 6.0 Enterprise Edition
Microsoft Visual C ++ 6.0 Professional Edition
Microsoft Visual C ++, 32-разрядная версия Learning Edition 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.

0
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: