使用Flash ActiveX作为免费注册

时间:2013-11-25 11:56:47

标签: c++ com activex

我有一个使用flash activex组件的游戏。

问题是我需要特定版本的闪存。

我不想在现有的更高版本上注册该组件,这可能会导致严重的安全问题。我只想将它用于我的应用程序。

我听说过使用我的应用程序的清单文件注册免费com技术,但没有找到任何有关使用flash activex甚至可能的信息。

所以我的问题是我们可以将flash activex组件作为免费注册的com吗?如果是,那么当我的尝试失败时,有哪些要求以及清单文件应该如何显示。

这是我尝试的.manife:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="App" version="1.0.0.1" 
        processorArchitecture="x86" publicKeyToken="0000000000000000" />

  <file name="Flash8.ocx">
    <comClass clsid="{D27CDB6E-AE6D-11cf-96B8-444553540000}" threadingModel="Both" />
  </file>
</assembly>

1 个答案:

答案 0 :(得分:2)

警告:在我给你太多希望之前,我还没有用Flash测试过。我用较小的东西测试了它,我“拥有”COM客户端和服务器。如果Flash或它所依赖的某些软件需要除纯COM和ActiveX控件之外的注册表设置,即使如此,清单(例如类别)中不可用的设置也可能无效。

为Flash安装的每个文件定义一个Assembly Manifest,该文件与Flash在安装期间注册的COM设置相匹配。如果您了解足够的COM,you'll - know - where - to - look。每个清单文件都必须具有与DLL不同的名称。

然后,为您的可执行文件创建一个Application Manifest,并在您之前选择的文件名后添加程序集依赖项。如果您的应用程序没有嵌入式清单,则为<your-application>.exe.manifest。如果有,则必须使构建工具包含这些依赖项。


MY-application.exe.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <!--
    name: a string with the format: Organization.Division.Name
          Note: It doesn't matter
    version: 4 numbers between 0 and 65535 separated with dots
             Note: It doesn't matter
  -->
  <assemblyIdentity type="win32" name="My.Application" version="1.0.0.0"/>

  <dependency>
    <dependentAssembly>

      <!--
        name: a string with the format: Organization.Division.Name
              Note: It doesn't matter, but it must match what's in the manifest
        version: 4 numbers between 0 and 65535 separated with dots
                 Note: It doesn't matter, but it must match what's in the manifest
      -->
      <assemblyIdentity type="win32" name="Adobe.Flash.Control" version="8.0.42.0"/>

    </dependentAssembly>
  </dependency>
</assembly>

Adob​​e.Flash.Control.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <!--
    name: a string with the format: Organization.Division.Name
          Note: It doesn't matter, but it must match what's in the dependency
    version: 4 numbers between 0 and 65535 separated with dots
             Note: It doesn't matter, but it must match what's in the dependency
  -->
  <assemblyIdentity type="win32" name="Adobe.Flash.Control" version="8.0.42.0"/>

  <!-- file elements
    name: HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32, default value
          HKEY_CLASSES_ROOT\TypeLib\{TLBID}\{version}\{lcid}\win32, default value
          Note: Keep only the file names
          Note: In this case, the class factories and the type library happen to be in the same file
                Otherwise, the comClass and the typelib elements would be under different file elements
  -->

  <file name="Flash8g.ocx">

    <!-- comClass elements
      description:         HKEY_CLASSES_ROOT\CLSID\{CLSID}, default value
      clsid:               {CLSID}
      threadingModel:      HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32, ThreadingModel
      tlbid:               HKEY_CLASSES_ROOT\CLSID\{CLSID}\TypeLib, default value
      progid:              HKEY_CLASSES_ROOT\CLSID\{CLSID}\ProgID, default value
      miscStatus:          HKEY_CLASSES_ROOT\CLSID\{CLSID}\MiscStatus, default value
      miscStatusIcon:      HKEY_CLASSES_ROOT\CLSID\{CLSID}\MiscStatus\4, default value
      miscStatusContent:   HKEY_CLASSES_ROOT\CLSID\{CLSID}\MiscStatus\1, default value
      miscStatusDocprint:  HKEY_CLASSES_ROOT\CLSID\{CLSID}\MiscStatus\8, default value
      miscStatusThumbnail: HKEY_CLASSES_ROOT\CLSID\{CLSID}\MiscStatus\2, default value
    -->

    <comClass description="Shockwave Flash Object"
              clsid="{D27CDB6E-AE6D-11cf-96B8-444553540000}"
              threadingModel="Apartment"
              tlbid="{D27CDB6B-AE6D-11cf-96B8-444553540000}"
              progid="ShockwaveFlash.ShockwaveFlash"
              miscStatus=""
              miscStatusContent="recomposeonresize,cantlinkinside,insideout,activatewhenvisible,setclientsitefirst">
      <progid>MacromediaFlashPaper.MacromediaFlashPaper</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.1</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.3</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.4</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.5</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.6</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.7</progid>
      <progid>ShockwaveFlash.ShockwaveFlash.8</progid>
    </comClass>

    <comClass description="Macromedia Flash Factory Object"
              clsid="{D27CDB70-AE6D-11cf-96B8-444553540000}"
              threadingModel="Apartment"
              tlbid="{D27CDB6B-AE6D-11cf-96B8-444553540000}"
              progid="FlashFactory.FlashFactory">
      <progid>FlashFactory.FlashFactory.1</progid>
    </comClass>

    <!-- typelib elements
      tlbid:      {TLBID}
      version:    HKEY_CLASSES_ROOT\CLSID\{CLSID}\Version, default value
                  HKEY_CLASSES_ROOT\Interface\{IID}\TypeLib, Version
      helpdir:    HKEY_CLASSES_ROOT\TypeLib\{TLBID}\{version}\HELPDIR, default value
      resourceid: HKEY_CLASSES_ROOT\TypeLib\{TLBID}\{lcid}, the subkey name
      flags:      HKEY_CLASSES_ROOT\TypeLib\{TLBID}\{version}\Flags, default value
    -->

    <typelib tlbid="{D27CDB6B-AE6D-11cf-96B8-444553540000}"
             version="1.0"
             helpdir="."
             resourceid="0"
             flags=""/>

    <!-- comInterfaceProxyStub elements
      iid:              {IID}
      name:             HKEY_CLASSES_ROOT\Interface\{IID}, default value
      tlbid:            HKEY_CLASSES_ROOT\Interface\{IID}\TypeLib, default value
      baseInterface:    HKEY_CLASSES_ROOT\Interface\{IID}\BaseInterface, default value
      numMethods:       HKEY_CLASSES_ROOT\Interface\{IID}\NumMethods, default value
      proxyStubClsid32: HKEY_CLASSES_ROOT\Interface\{IID}\ProxyStubClsid32, default value
      threadingModel:   HKEY_CLASSES_ROOT\CLSID\{ProxyStubClsid32}\InprocServer32, ThreadingModel
    -->
    <!-- I found no need for any comInterfaceProxyStub -->
  </file>

  <!-- comInterfaceExternalProxyStub elements
    iid:              {IID}
    baseInterface:    HKEY_CLASSES_ROOT\Interface\{IID}\BaseInterface, default value
    numMethods:       HKEY_CLASSES_ROOT\Interface\{IID}\NumMethods, default value
    name:             HKEY_CLASSES_ROOT\Interface\{IID}, default value
    tlbid:            HKEY_CLASSES_ROOT\Interface\{IID}\TypeLib, default value
    proxyStubClsid32: HKEY_CLASSES_ROOT\Interface\{IID}\ProxyStubClsid32, default value
  -->

  <!--
    I found these lingering from the current Flash installation I have.
    Please check if they are the same for Flash 8.
    If you don't need them, just remove them.

    These are comInterfaceExternalProxyStub and not comInterfaceProxyStub,
    because both {00020420-0000-0000-C000-000000000046} (PSDispatch, IDispatch-based interfaces)
    and {00020424-0000-0000-C000-000000000046} (PSOAInterface, Type Library interfaces)
    come with Windows.
  -->

  <comInterfaceExternalProxyStub iid="{86230738-D762-4C50-A2DE-A753E5B1686F}"
                                 name="IFlashObject"
                                 tlbid="{D27CDB6B-AE6D-11CF-96B8-444553540000}"
                                 proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"/>

  <comInterfaceExternalProxyStub iid="{D27CDB6C-AE6D-11CF-96B8-444553540000}"
                                 name="IShockwaveFlash"
                                 tlbid="{D27CDB6B-AE6D-11CF-96B8-444553540000}"
                                 proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"/>

  <comInterfaceExternalProxyStub iid="{D27CDB6D-AE6D-11CF-96B8-444553540000}"
                                 name="_IShockwaveFlashEvents"
                                 tlbid="{D27CDB6B-AE6D-11CF-96B8-444553540000}"
                                 proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"/>

</assembly>

我使用以下简单的示例测试,它似乎工作。使用Process Explorer,我可以看到它加载了本地Flash8g.ocx:


MY-application.cpp

#include <windows.h>

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
    HRESULT hr;

    if (SUCCEEDED(hr = CoInitialize(NULL))) {
        CLSID clsid;
        // Both ways work
        if (SUCCEEDED(hr = CLSIDFromProgID(L"ShockwaveFlash.ShockwaveFlash.8", &clsid))) {
        /*if (SUCCEEDED(hr = CLSIDFromString(L"{D27CDB6E-AE6D-11cf-96B8-444553540000}", &clsid))) {*/
            IDispatch *flash;
            // IID_PPV_ARGS is better, but doesn't exist in older SDKs
            /*if (SUCCEEDED(hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&flash)))) {*/
            if (SUCCEEDED(hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&flash))) {
                OLECHAR name[] = L"ReadyState";
                LPOLESTR names[] = { &name[0] };
                DISPID dispid;
                if (SUCCEEDED(hr = flash->GetIDsOfNames(IID_NULL, names, sizeof(names)/sizeof(names[0]), LOCALE_SYSTEM_DEFAULT, &dispid))) {
                    DISPPARAMS params;
                    VARIANT result;
                    EXCEPINFO excepinfo;
                    UINT argerr;
                    params.rgvarg = NULL;
                    params.rgdispidNamedArgs = NULL;
                    params.cArgs = 0;
                    params.cNamedArgs = 0;
                    // Initialize out args due to buggy IDispatch implementations
                    VariantInit(&result);
                    excepinfo.wCode = 0;
                    excepinfo.wReserved = 0;
                    excepinfo.bstrSource = NULL;
                    excepinfo.bstrDescription = NULL;
                    excepinfo.bstrHelpFile = NULL;
                    excepinfo.dwHelpContext = 0;
                    excepinfo.pvReserved = NULL;
                    excepinfo.pfnDeferredFillIn = NULL;
                    excepinfo.scode = S_OK;
                    argerr = 0;
                    if (SUCCEEDED(hr = flash->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &result, &excepinfo, &argerr))) {
                        MessageBox(NULL, "The example ran to completion.", "Flash test", MB_OK);
                        VariantClear(&result);
                        SysFreeString(excepinfo.bstrSource);
                        excepinfo.bstrSource = NULL;
                        SysFreeString(excepinfo.bstrDescription);
                        excepinfo.bstrDescription = NULL;
                        SysFreeString(excepinfo.bstrHelpFile);
                        excepinfo.bstrHelpFile = NULL;
                    }
                }
                flash->Release();
                flash = NULL;
            }
        }
        CoUninitialize();
    }
    if (SUCCEEDED(hr)) {
        return 0;
    }
    else {
        return 1;
    }
}