vector<QQInfo> list;
::CoInitialize(NULL);
CSSOForPTLogin AutoQQLogin;
CTXSSOData AA=AutoQQLogin.CreateTXSSOData();
AutoQQLogin.InitSSOFPTCtrl(0,AA);
CTXSSOData g_vOptData=AutoQQLogin.CreateTXSSOData();
CTXSSOData Q =AutoQQLogin.DoOperation(1, g_vOptData);
CTXSSOArray N= Q.GetArray(_T("PTALIST"));  //运行到这就报错了
ULONG ulSize=N.GetSize();
         ...//N行代码
::CoUninitialize();
我调用的是SSOAxCtrlForPTLogin.dll,该文件实现QQ空间的快速登陆,
我用的是VS2008,出现如下错误test.exe 中的 0x78b24e36 (mfc90ud.dll) 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突以下是堆栈的调用:
> mfc90ud.dll!COleDispatchDriver::InvokeHelperV(long dwDispID=1610809363, unsigned short wFlags=1, unsigned short vtRet=9, void * pvRet=0x0012e68c, const unsigned char * pbParamInfo=0x0046c4c4, char * argList=0x0012e5bc)  行397 + 0x30 字节 C++
  mfc90ud.dll!COleDispatchDriver::InvokeHelper(long dwDispID=1610809363, unsigned short wFlags=1, unsigned short vtRet=9, void * pvRet=0x0012e68c, const unsigned char * pbParamInfo=0x0046c4c4, ...)  行553 C++
  test.exe!CTXSSOData::GetArray(const wchar_t * bsParamName=0x004610a0)  行270 + 0x1f 字节 C++
  test.exe!CommonFun::GetQQList()  行186 + 0xd 字节 C++
最终出错的是oledisp2.cpp中的396行,代码如下
SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
&dispparams, pvarResult, &excepInfo, &nArgErr);
我在网上搜索了一下,说是没有加入::CoInitialize(NULL);才会这样,可是我已经加上去了
错误也是一样的,为什么会这样呢?请高手解答!

解决方案 »

  1.   

    把可以复现问题的代码发给我,我帮你调试一下
    [email protected]
      

  2.   

    你好, 已经知道根源了由于你没有调用CreateDispatch,所以包装类里面的m_lpDispatch不是0,就是0xcccccccc(这个就是保证让你发生别的错误之前马上crash你的程序),当你的指针为0xcccccccc时,任何尝试读取他的内容的指令都会引发access vioalation exeception。我调用了CreateDispatch如下,但是当我们调用COM方法CreateTXSSOData又出错了,这个错误是由于这个方法本身造成的和微软的平台没有关系了,如果不知道这个方法的源代码,很难再调试了,很可能这个方法体内有做了什么检查,由于条件不对,所以返回0x80020009 CSSOForPTLogin AutoQQLogin;
                            AutoQQLogin.CreateDispatch(L"SSOAxCtrlForPTLogin.SSOForPTLogin.1"); // I add this line
     CTXSSOData AA=AutoQQLogin.CreateTXSSOData();
     AutoQQLogin.InitSSOFPTCtrl(0,AA);
     CTXSSOData g_vOptData=AutoQQLogin.CreateTXSSOData();
     CTXSSOData Q =AutoQQLogin.DoOperation(1, g_vOptData);
     CTXSSOArray N= Q.GetArray(_T("PTALIST"));
    在2010-03-13 13:40:23,49735374 <[email protected]> 写道:文件在附件里, 谢谢你,有消息记得通知我呀
     
    我QQ是:49735374
      

  3.   


    你好,非常感谢你的回答,现在问题已经解决了方法是加上,开始处CreateDispatch,
    末尾处加上ReleaseDispatch
    可是我不知道CreateDispatch(这个参数),这个参数为什么一定要用SSOAxCtrlForPTLogin.SSOForPTLogin.1能否说说呀
      

  4.   

    把关键代码发上来看::CoInitialize(NULL);
    CSSOForPTLogin AutoQQLogin;
    AutoQQLogin.CreateDispatch("SSOAxCtrlForPTLogin.SSOForPTLogin.1");  //这里为什么要用SSOAxCtrlForPTLogin.SSOForPTLogin.1作为参数呢?
    CTXSSOData AA=AutoQQLogin.CreateTXSSOData();
    AutoQQLogin.InitSSOFPTCtrl(0,AA);
    CTXSSOData g_vOptData=AutoQQLogin.CreateTXSSOData();
    CTXSSOData Q =AutoQQLogin.DoOperation(1, g_vOptData);
    CTXSSOArray N= Q.GetArray(_T("PTALIST"));
    ULONG ulSize=N.GetSize();
    for (UINT V = 0; V < ulSize; V++)
    {
    CTXSSOData C = N.GetData(V);
    UINT S = C.GetDWord(_T("dwSSO_Account_dwAccountUin"));
    CTXSSOArray G = C.GetArray(_T("SSO_Account_AccountValueList"));
    CString T = G.GetStr(0); USHORT L = 0;
    try
    {
    L = C.GetWord(_T("wSSO_Account_wFaceIndex"));
    }
    catch(...)
    {
    L = 0;
    }
    CString M = _T("");
    try
    {
    M = C.GetStr(_T("strSSO_Account_strNickName"));
    }
    catch(...)
    {
    M = _T("");
    }
    BYTE J = 0;
    try
    {
    J = C.GetByte(_T("cSSO_Account_cGender"));
    }
    catch(...)
    {
    J = 0;
    }
    UINT K = 0;
    try
    {
    K = C.GetDWord(_T("dwSSO_Account_dwUinFlag"));
    }
    catch(...)
    {
    K = 0;
    }
    CTXSSOBuffer D = C.GetBuf(_T("bufGTKey_PTLOGIN"));
    CTXSSOBuffer E = C.GetBuf(_T("bufST_PTLOGIN"));
    CString I = _T("");
    UINT A = E.GetSize();
    for (UINT O = 0; O < A; O++)
    {
    BYTE b=E.GetAt(O);
    CString str;
    str.Format(_T(""), b);
    if(str.GetLength()<2) str=_T("0")+str;
    //string B =Convert.ToString( E.GetAt((UINT)O),16).PadLeft (2,'0');
    I += str;
    }
    QQInfo NewInfo; //将所获得的信息存入List
    NewInfo.uin = S;
    NewInfo.name = T;
    NewInfo.face = L;
    NewInfo.gender = J;
    NewInfo.nick = M;
    NewInfo.key = I;

    AfxMessageBox(T);
    }
    AutoQQLogin.ReleaseDispatch();  //这里释放
    ::CoUninitialize();