求教:
我用ATL写了一个MTS组件,然后在Console下调试,No Problem.
But!当把该组件注册到COM+服务,再进行调试,O'My God, CreateInstance(...)创建实例失败.
疑惑?求教.......
急 急 急
我用ATL写了一个MTS组件,然后在Console下调试,No Problem.
But!当把该组件注册到COM+服务,再进行调试,O'My God, CreateInstance(...)创建实例失败.
疑惑?求教.......
急 急 急
解决方案 »
- 批处理命令bat问题,我有两个批处理文件,都可执行,如何在第三个bat文件中执行这两个
- 如何继承windows的鼠标类?
- 关于如何为FormView中的Richedit添加右键菜单,并响应CTRL+C等快捷键
- 如何使IE最大化啊??
- 高分求语音聊天程序 100分
- 如何将(32*32 256/16)bmp文件转化成图标文件
- 高分求助,关于字符串的问题?
- 一个很菜的问题,我该怎么样学习编程?
- 1000分!!怎样利用socks5代理从内部网络连接到外部网络?大家发表一下意见,有观点的马上给分。是大虾求求发个源码,很急的,只要能用,
- 请推荐几个支持VC开发的工作流产品
- 多谢puhuofeie(扑火飞蛾) ,请来接分
- 请教!!
MTS组件属性
1.Threading Model: Both
2.事务支持: 无
3.启用对象池: 否问题描述:
1.没有注册到COM+目录时,Console程序实例化组件的语句为:
ISophe* pSophe=NULL;
HRESULT hr=CoCreateInstance(CLSID_Sophe,NULL,CLSCTX_ALL,IID_ISophe,(void**)&pSophe);
调试成功
2.注册到COM+目录后,重新配置了Project/Setting/Debug项
Executable for debug session: c:\winnt\system32\dllhost
Program argument: /ProcessID:{D887EB5A-07F5-4187-B8F9-EDB928D74E37}
调试失败
刚刚看到有关于CoCreateInstanceEx的贴子,上面提到了COM+组件,所以我就用CoCreateInstanceEx调试了一下,具体如下:
COSERVERINFO cs;
memset(&cs,0,sizeof(cs));
cs.pwszName=OLESTR("wuthering-ware"); MULTI_QI qi[1];
memset(qi,0,sizeof(qi));
qi[0].pIID=&IID_ISophe; HRESULT hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
ISophe* pSophe=NULL;
//hr=CoCreateInstance(CLSID_Sophe,NULL,CLSCTX_ALL,IID_ISophe,(void**)&pSophe);
hr = CoCreateInstanceEx(CLSID_Sophe, // clsid
NULL, // outer unknown
CLSCTX_SERVER, //server context
&cs, // server info
1, // size of qi
qi // MULTI_QI array
); 结果和用CoCreateInstance相同,没有注册到COM+目录前调试成功.注册到COM+目录后,调试出错.
请各位大侠指教....
急......
//Set a low level of security
hr=CoInitializeSecurity(NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
if(FAILED(hr))
return 0;语句执行通过.但CoCreateInstanceEx(...)还是返回失败.我又到COM+目录服务中进行了如下安全设置:
调用的身份验证级: 无
模拟级: 匿名
然后调试,仍然失败.可否就"检查安全性设置"问题更详细的描述.不胜感激.....
IUnknown --- COM的根接口
IObjectControl --- 支持COM+缓冲池功能的接口
ISophe --- 用户自定义接口
组件的Threading Model: Both
在VC6.0下通过Console程序调试,CreateInstance,CreateInstanceEx都是失败.当我修改了该COM+组件的接口后,修改如下:
把该组件改成dual接口,既支持IDispatch
O' That's crazy..... 她通过了.
更加疑惑!!!!!!!!!!不是说IDispatch接口是为了那些Scripting Host(没有Pointer概念的语言)服务的吗?
可我现在是在C++的语言环境下啊,应该是可以通过IUnknown联系通信的啊?
未加入COM+环境时,由于楼主的组件是Both,且又是MTS组件(一定是进程内组件),故在客户端时一定不会发生跨套间问题,又估计楼主使用标准汇集法(即使用MIDL编译IDL文件),因此没有对代理/占位组件的需求,故没有任何问题。COM+和MTS中的组件的每一个实例都有一个环境对象和其相绑定,而绑定的方式就是MTS或COM+通过改写标准代理对象(也就是代理管理器和占位管理器)来截获对组件对象的调用从而实行即时激活、自动事务等服务。也就是说MTS/COM+都一定会加载代理/占位组件而不管这个组件对象实际是否跨套间调用。而楼主后来改成双接口,IDispatch的代理/占位组件已经注册了(为ole32.dll),所以后来又正常了。
彼人刚开始使用COM/COM+(开发工具是VC6.0)开发系统,以前都是用VB6.0开发COM/COM+的.