DLL中调用CoCreateInstance有关问题

DLL中调用CoCreateInstance问题
在MyDll项目中的DllMain调用CoCreateInstance创建COM组件对象实例,一直返回E_NOINTERFACE,而在EXE项目中调用CoCreateInstance则不会出现任何问题。

CoCreateInstance(guids,NULL,CLSCTX_INPROC_SERVER,IID_ICA,pcs);

前提CoInitialize(NULL)初始化没出现任何问题。求高人解答。

------解决方案--------------------
参考下这里
http://topic.okbase.net/200809/2008092217/3459793.html
------解决方案--------------------
失败是可能的,还可能使应用程序挂起
我从
http://support.microsoft.com/kb/305723/
看到,微软的建议是
若要解决此问题,不要从 DllMain 调用 CoCreateInstance。您可以移动该调用初始化函数,或稍后调用的任何其他功能。


  


------解决方案--------------------
DLL是不是在EXE的主线程,你的COM组件是否有套间等要求.
------解决方案--------------------
首先不能在DLLMAIN中直接或间接LoadLibrary,否则就是臭名昭著的DLL HELL。CoCreateInstance碰巧就是间接的LoadLibrary。
其次还得检查CoCreateInstance的执行条件,或许COM未初始化,或许套间类型不对,或许CLSID或IID有误,或许组件实现有问题,总之要仔细检查参数。
------解决方案--------------------
2、尝试用DLL导出其它接口,比如Init,在Init内部调用了CoCreateInstance不会死锁,但是发生错误,返回值是E_NOINTERFACE。
----------------

那有可能是COM组件内部初始化的问题。
COM组件是你们自己写的吗?最好问问作者,这个接口对调用环境有啥要求。

比如mfc dll AfxGetStaticModuleState 之类的

猜想:COM作者在写的时候:

do_init
if ( init_failed )
{
return E_NOINTERFACE;
}
------解决方案--------------------
00000003-0000-0000-C000-000000000046 是 IMarshal 接口

你COM组件实现的不完整,没有实现IMarshal接口。在需要CoMarshalInterface的情况下失败了...
------解决方案--------------------
DLLMain 可以不用 CreateInstance 

你用loadLibray 那样的加载DLL COM 看看行不行~! ? 

我感觉应该可以 


------解决方案--------------------
探讨
其中MyDll是一个LSP的DLL,被其他socket加载是能够CreateInstance实例对象的,而被IE加载,却无法Createinstance,被火狐加载也是一样的,是不是COM宿主方面的原因,谁碰到过呢?谢谢