使用Flash的ActiveX免费注册(Use Flash ActiveX as registrat

2019-10-19 01:28发布

我有一个使用闪光灯ActiveX组件游戏。

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

我不希望在现有的高版本这可能会导致大的安全问题,注册的组件。 我只想用我的应用程序。

我听说过使用我的应用程序清单文件注册免费COM技术,但并没有发现使用它与Flash的ActiveX,甚至其可能的任何信息。

所以我的问题是有可能给我们的闪存ActiveX组件作为注册免费的COM? 如果是,那么有什么要求,以及如何在清单文件应该看起来像我的尝试失败了。

这是我试过的.manifest的:

<?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>

Answer 1:

警告:之前我给你太多的希望,我还没有与Flash测试这一点。 我和小东西,我所“拥有”两个COM客户端和服务器进行了测试。 如果Flash或一些这取决于软件需要比纯COM和ActiveX控件其他注册表设置,即使如此,设置其不在清单(如类别)可用的,这可能无法正常工作。

定义一个程序集清单有关Flash安装的每个文件,相匹配的Flash安装过程中注册COM设置。 如果你知道足够COM, 你 - 知道 - 在那里 - 到 - 看 。 每个清单文件中必须从DLL不同的名称。

然后,创建一个应用程序清单为您的可执行文件和您之前选择的文件名后添加组件的依赖关系。 如果您的应用程序没有嵌入清单,这将是<your-application>.exe.manifest 。 如果有,你必须使你的构建工具包括这些依赖关系。


我-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>

Adobe.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:


我-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;
    }
}


文章来源: Use Flash ActiveX as registration free
标签: c++ com activex