我有一个使用闪光灯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>
警告:之前我给你太多的希望,我还没有与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, ¶ms, &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;
}
}