描述:
在exe文件中启动一个dll,在这个dll中又调用exe文件提供的接口函数出错???
主要现象:
1、这个exe文件提供了automation支持,将其中的CDocument自动化了,并提供了一些方法和属性。
2、在DLL中要是CoInitialize(NULL),就会返回S_FALSE,我估计是exe文件因为也CoInitialize(NULL)的缘故。
3、在这个dll中又调用exe文件提供的接口函数出错或根本未执行
4、如果用另外一个正常的测试程序exe中启动这个dll,并在dll中执行原来的exe提供的方法就一切OK了。
不知是什么原因???望高手给了一些解决方法。
解决方案1:
结果怎么会这样……………!!
解决方案2: 你的exe使用了一个dll,dll再调用exe提供的服务,这是完全可行的,首先,你调用dll方法的线程(exe线程)已经执行了CoInitialize,当它调用dll方法时,你又执行CoInitialize,当然会返回S_FALSE,然后它调用自身所属的exe提供的服务,这相当于exe的一个线程调用自己的服务,有什么不可以的?
你的dll是不是com?如果是,exe线程需要执行CoInitialize,否则不需要。
调用dll方法的exe线程,不会是提供服务的线程,你可以不考虑dll的存在,这只相当于exe线程调用自己的服务,这样如果可以,那使用了dll后也可以,问题是出在你的exe里。
你可以在exe里写个类似dll中的方法,先不用dll,看能不能成功。
“在exe文件中启动一个dll,同时这个exe又作为自动化服务器,在这个dll中又调用exe文件提供的接口函数,”,这是可以行的通的,(并且这个Dll同时也可以是一个Com组件),代码:
IJb* appDesign=new IJb;
appDesign.AttachDispatch(pDispatchDesign);
试一试,pDispatchDesign是主程序传递过来的接口指针,这个指针用CCmdTarget::GetIDispatch()
来获取,主程序自动化类CDocument肯定也是继承于CCmdTarget吧,Dll所控制的就是当前的主程序.
我的问题更郁闷,Dll是个Com组件,还要动态获取其信息,哪位高手能参阅
http://community.csdn.net/Expert/topic/3477/3477461.xml?temp=.7351648
帮我解决一下
pUnknownDesign->QueryInterface(IID_IDispatch,(LPVOID *)&pDispatchDesign);
你的COM组件实现了IID_IDispath么(返回的是不是NULL并且HRESULT为S_OK?)
hrDesign=pUnknownDesign->QueryInterface(IID_IDispatch,(LPVOID *)&pDispatchDesign);
if(FAILED(hr)) throw(_T("没有取得IDispatchPtr"));
if(!pDispatchDesign) throw(_T("没有取得IDispatchPtr"));//试试
appDesign.AttachDispatch(pDispatchDesign);
appDesign.CopyGztImage(1); //执行这一句但是不正确,没有错误提示
pUnknownDesign->Release();
pUnknownDesign=NULL;
if possible, send me your project: clineyuan@sina.com
解决方案6: 回楼上:这样说,问题可能出在hrDesign=::GetActiveObject(clsidDesign,NULL,&pUnknownDesign);这一句。第一种情况,该语句可能执行失败。而你的代码又没检查hrDesign?
另外if(FAILED(hr)) throw(_T("没有取得IDispatchPtr"));我没看见你在哪里定义了hr?
不懂,学习
解决方案8:200分的問題, 幫頂
解决方案9: 你在DLL中如何调exe提供的接口函数的?
1是自己CreateInstance,
2把Document的接口指针传到DLL
3GetActiveObject
?
对 automation 了解不多
帮 UP
dll是进程内组件,
直接把指针传递过去就完了,
不需要通过COM接口吧。