C++ 使用Flash ActiveX作为免费注册
我有一个使用flash activex组件的游戏 问题是我需要一个特定版本的flash 我不想在现有的更高版本上注册该组件,这会导致严重的安全问题。我只想把它用于我的应用程序 我听说过免费注册com技术在我的应用程序中使用清单文件,但没有找到任何关于将其与flash activex一起使用的信息,甚至没有找到任何可能的信息 所以我的问题是,我们是否可以将flash activex组件作为免注册的com组件?如果是,那么当我的尝试失败时,要求是什么,清单文件应该是什么样子 这是我试过的清单:C++ 使用Flash ActiveX作为免费注册,c++,com,activex,C++,Com,Activex,我有一个使用flash activex组件的游戏 问题是我需要一个特定版本的flash 我不想在现有的更高版本上注册该组件,这会导致严重的安全问题。我只想把它用于我的应用程序 我听说过免费注册com技术在我的应用程序中使用清单文件,但没有找到任何关于将其与flash activex一起使用的信息,甚至没有找到任何可能的信息 所以我的问题是,我们是否可以将flash activex组件作为免注册的com组件?如果是,那么当我的尝试失败时,要求是什么,清单文件应该是什么样子 这是我试过的清单: &l
<?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控件以外的注册表设置,即使如此,清单(例如类别)中不可用的设置也可能不起作用 为闪存安装的每个文件定义一个,该文件与安装期间闪存注册的COM设置相匹配。如果你足够了解COM,---。每个清单文件的名称必须与DLL不同 然后,为可执行文件创建程序集,并在前面选择的文件名之后添加程序集依赖项。如果应用程序没有嵌入式清单,则该清单将是
.exe.manifest
。如果有,则必须使构建工具包含这些依赖项
my-application.exe.manifest
Adobe.Flash.Control.manifest
MacromediaFlashPaper.MacromediaFlashPaper
ShockwaveFlash.ShockwaveFlash.1
ShockwaveFlash.ShockwaveFlash.3
shockwavelash.shockwavelash.4
shockwavelash.shockwavelash.5
ShockwaveFlash,ShockwaveFlash
ShockwaveFlash.ShockwaveFlash.7
ShockwaveFlash.ShockwaveFlash.8
FlashFactory.FlashFactory.1
我使用下面的裸体示例进行了测试,它似乎是有效的。使用Process Explorer,我可以看到它加载了本地Flash8g.ocx:
my-application.cpp
#包括
int-WINAPI-WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
国际nCmdShow
)
{
HRESULT-hr;
if(成功(hr=CoInitialize(NULL))){
CLSID-CLSID;
//两种方法都有效
if(成功(hr=CLSIDFromProgID(L“shockwavelash.shockwavelash.8”,&clsid))){
/*if(成功(hr=CLSIDFromString(L“{D27CDB6E-AE6D-11cf-96B8-444553540000},&clsid))){*/
IDispatch*闪光;
//IID_PPV_ARGS更好,但在较旧的SDK中不存在
/*if(成功(hr=CoCreateInstance(clsid,NULL,CLSCTX\u INPROC\u SERVER,IID\u PPV\u ARGS(&flash))){*/
if(成功(hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,IID_IDispatch,(void**)和flash))){
鹰嘴名称[]=L“ReadyState”;
LPOLESTR名称[]={&name[0]};
DISPID DISPID;
if(成功(hr=flash->GetIDsOfNames(IID\u NULL,名称,sizeof(名称)/sizeof(名称[0]),区域设置\u系统\u默认值,&dispid))){
DISPPARAMS-params;
变异结果;
EXCEPINFO EXCEPINFO;
UINT-argerr;
params.rgvarg=NULL;
params.rgdispidNamedArgs=NULL;
参数cArgs=0;
params.cNamedArgs=0;
//由于IDispatch实现有缺陷,初始化出参数
方差(和结果);
excepinfo.wCode=0;
excepinfo.wReserved=0;
excepinfo.bstrSource=NULL;
excepinfo.bstrDescription=NULL;
EXEPINFO.bstrHelpFile=NULL;
excepinfo.dwHelpContext=0;
excepinfo.pvReserved=NULL;
excepinfo.pfnDeferredFillIn=NULL;
excepinfo.scode=S_OK;
argerr=0;
if(成功(hr=flash->Invoke(dispid、IID\u NULL、LOCALE\u SYSTEM\u DEFAULT、DISPATCH\u PROPERTYGET、¶ms、&result、&excepinfo、&argerr))){
MessageBox(NULL,“示例运行到完成”,“Flash测试”,MB_OK);
方差线性(和结果);
SysFreeString(不包括pinfo.bstrSource);
excepinfo.bstrSource=NULL;
SysFreeString(不包括fo.bstrDescription);
excepinfo.bstrDescription=NULL;
SysFreeString(excepinfo.bstrHelpFile);
EXEPINFO.bstrHelpFile=NULL;
}
}
flash->Release();
flash=NULL;
}
}
coninitialize();
}
如果(成功(hr)){
返回0;
}
否则{
返回1;
}
}
没有成功。希望有更具体的示例。@Spider,我添加了示例清单。您可能需要根据实际的GUID、版本等进行调整。非常感谢。我还没有设法让它工作,但我将尝试找到正确的接口描述,并希望它能工作。现在已经很清楚了。@Spider,我已经用Flash 8测试过了0.42.0(AT)和一个裸的'WiMeNe',使用代码> >初始化> <代码>和<代码> COCCREATEAUTION< /COD> > AH,我使用C++ Builder和ActiveActiveCyto生成器。我将尝试更改它。