COM调用问题 高手进~ 纠结了很多天的问题 本帖最后由 EdwinWY 于 2010-03-31 10:21:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是注册信息被破坏了,内部链接的GUID不对。 app.CreateDispatch 内部也是调用的CLSIDFromProgID(), CoCreateInstance()你在app.CreateDispatch那里下个断点,跟进去看看是哪里出的错上代码:BOOL COleDispatchDriver::CreateDispatch(LPCTSTR lpszProgID, COleException* pError){ ASSERT(m_lpDispatch == NULL); // map prog id to CLSID CLSID clsid; SCODE sc = AfxGetClassIDFromString(lpszProgID, &clsid); if (FAILED(sc)) { if (pError != NULL) pError->m_sc = sc; return FALSE; } // create with CLSID return CreateDispatch(clsid, pError);}BOOL COleDispatchDriver::CreateDispatch(REFCLSID clsid, COleException* pError){ ASSERT(m_lpDispatch == NULL); m_bAutoRelease = TRUE; // good default is to auto-release // create an instance of the object LPUNKNOWN lpUnknown = NULL; SCODE sc = CoCreateInstance(clsid, NULL, CLSCTX_ALL | CLSCTX_REMOTE_SERVER, IID_IUnknown, (LPLP)&lpUnknown); if (sc == E_INVALIDARG) { // may not support CLSCTX_REMOTE_SERVER, so try without sc = CoCreateInstance(clsid, NULL, CLSCTX_ALL & ~CLSCTX_REMOTE_SERVER, IID_IUnknown, (LPLP)&lpUnknown); } if (FAILED(sc)) goto Failed; // make sure it is running sc = OleRun(lpUnknown); if (FAILED(sc)) goto Failed; // query for IDispatch interface m_lpDispatch = QUERYINTERFACE(lpUnknown, IDispatch); if (m_lpDispatch == NULL) goto Failed; ...HRESULT AFXAPI AfxGetClassIDFromString(LPCTSTR lpsz, LPCLSID lpClsID){ HRESULT hr; const CStringW strClsID(lpsz); if (lpsz[0] == '{') { hr = CLSIDFromString(const_cast<LPOLESTR>(strClsID.GetString()), lpClsID); } else { hr = CLSIDFromProgID(strClsID.GetString(), lpClsID); } return hr;} app.CreateDispatch那个函数貌似没法F11进去改成如下直接传clsid,仍然失败。。CLSID clsid;HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);if(FAILED(hr)) { return; }if(!app.CreateDispatch(clsid)){return;} 不懂CoInitialize(NULL);感觉这个看起来多余 ado访问数据库出现的怪异现象 如何通过menu使listcontrol中滚动条停止滚动???急急急!!! 这个函数哪里错了 疑惑,如何判断一个文件是二进制文件,还是文件文件? _ConnectionPtr的WillConnect事件,怎么使用,想在那里写代码。 ado调用存储过程,有时正常有时报#3121错误,何故? 急问,!!!!CAsyncSocket 的FD_WRITE事件的问题 CSocket 基础知识疑问,char aaa[3]在函数结束时如何释放 iostream 的 cin >>如何接收多字符串 有关于下拉菜单的问题 对话框程序 父对话框响应子对话框控件消息
CLSIDFromProgID(), CoCreateInstance()你在app.CreateDispatch那里下个断点,跟进去看看是哪里出的错上代码:
BOOL COleDispatchDriver::CreateDispatch(LPCTSTR lpszProgID,
COleException* pError)
{
ASSERT(m_lpDispatch == NULL); // map prog id to CLSID
CLSID clsid;
SCODE sc = AfxGetClassIDFromString(lpszProgID, &clsid);
if (FAILED(sc))
{
if (pError != NULL)
pError->m_sc = sc;
return FALSE;
} // create with CLSID
return CreateDispatch(clsid, pError);
}BOOL COleDispatchDriver::CreateDispatch(REFCLSID clsid, COleException* pError)
{
ASSERT(m_lpDispatch == NULL); m_bAutoRelease = TRUE; // good default is to auto-release // create an instance of the object
LPUNKNOWN lpUnknown = NULL;
SCODE sc = CoCreateInstance(clsid, NULL, CLSCTX_ALL | CLSCTX_REMOTE_SERVER,
IID_IUnknown, (LPLP)&lpUnknown);
if (sc == E_INVALIDARG)
{
// may not support CLSCTX_REMOTE_SERVER, so try without
sc = CoCreateInstance(clsid, NULL, CLSCTX_ALL & ~CLSCTX_REMOTE_SERVER,
IID_IUnknown, (LPLP)&lpUnknown);
}
if (FAILED(sc))
goto Failed; // make sure it is running
sc = OleRun(lpUnknown);
if (FAILED(sc))
goto Failed; // query for IDispatch interface
m_lpDispatch = QUERYINTERFACE(lpUnknown, IDispatch);
if (m_lpDispatch == NULL)
goto Failed;
...HRESULT AFXAPI AfxGetClassIDFromString(LPCTSTR lpsz, LPCLSID lpClsID)
{
HRESULT hr;
const CStringW strClsID(lpsz);
if (lpsz[0] == '{')
{
hr = CLSIDFromString(const_cast<LPOLESTR>(strClsID.GetString()), lpClsID);
}
else
{
hr = CLSIDFromProgID(strClsID.GetString(), lpClsID);
}
return hr;}
改成如下直接传clsid,仍然失败。。
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if(FAILED(hr)) {
return;
}
if(!app.CreateDispatch(clsid))
{
return;
}