以下代码在ASP中调用时,如果不断刷新页面,会出现下列错误:
Active Server Pages 错误 'ASP 0115' 
意外错误 
/index.asp 
外部对象中发生一个可捕捉的错误(C0000005)。脚本无法继续执行。 STDMETHODIMP Cuser::get_Create(BSTR User,BSTR Group, IDispatch** pVal)
{
// TODO: 在此添加实现代码errcode=1;
IADsContainer *pCont = NULL;
CComBSTR dstring;
if((dstring=GetDomainString())==NULL) return S_OK; //此函数见下面
CComBSTR domainstr("LDAP://OU=");
domainstr.AppendBSTR(Group);
domainstr.Append(",");
domainstr.Append(dstring);
HRESULT hr;
hr = ADsOpenObject(domainstr,
          luser,//管理员
  lpass,//管理员密码
  ADS_SECURE_AUTHENTICATION|ADS_PROMPT_CREDENTIALS,
                  IID_IADsContainer, 
                   (void**) &pCont );
 if(!SUCCEEDED(hr))
   {
LPVOID lpMsgBuf;
   FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    hr,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
   );
     Estring=(LPCTSTR)lpMsgBuf;    //Estring是一个CComBSTR
return S_OK;}
IADs *pADs=NULL;
IDispatch *pVall=NULL;
CComBSTR temp2("CN=");
temp2.AppendBSTR(User);
hr = pCont->Create(L"user",temp2, &pVall);
pCont->Release();
if(!SUCCEEDED(hr))

 LPVOID lpMsgBuf;
   FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    hr,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
   );
     Estring=(LPCTSTR)lpMsgBuf;
 return S_OK;
}
 hr = pVall->QueryInterface(IID_IADs, (void**) &pADs );
 pVall->Release();
 if ( !SUCCEEDED(hr) ) { 
LPVOID lpMsgBuf;
   FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    hr,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
   );
     Estring=(LPCTSTR)lpMsgBuf;
 return S_OK;}
CComVariant temp3(User);
hr=pADs->Put(L"samAccountName",temp3);
hr=pADs->SetInfo(); // Commit
if ( !SUCCEEDED(hr) ) { 
LPVOID lpMsgBuf;
   FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    hr,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
   );
    Estring=(LPCTSTR)lpMsgBuf;
return S_OK;
}
pADs->QueryInterface(IID_IADsUser,(void**)pVal);
pADs->Release();
errcode=0;
return S_OK;
}
CComBSTR Cuser::GetDomainString(void)
{   
IADs* des=NULL;
HRESULT hr;
hr = ADsGetObject(L"LDAP://rootDSE",IID_IADs,(void**)&des);
    if(!SUCCEEDED(hr))
{
LPVOID lpMsgBuf;
   FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    hr,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
   );
     Estring=(LPCTSTR)lpMsgBuf;;
return NULL;
}
    VARIANT dnc;
    des->Get(L"defaultNamingContext",&dnc);
    des->Release();
CComBSTR bstr;
bstr.m_str=dnc.bstrVal;
return bstr;
}

解决方案 »

  1.   

    帮忙呀
    现在一遇到ASP 0115,我的inetinfo.exe就宕了
      

  2.   

    问题还没看出来,不过我觉得错误处理中有内存泄漏。
    lpMsgBuf没有释放掉。
      

  3.   

    有可能,那lpMsgBuf应该如何被释放?
    Estring=(LPCTSTR)lpMsgBuf;
    在第三次刷新页面时就出问题,改为:
    Estring=“xxxxxxxxxxxx";
    就会到第5、6次才会出问题
      

  4.   

    没有用,我用localfree释放了,还是不行
    肯定有其他问题
      

  5.   

    如果参数生命为BSTR,不要用LPWSTR,LPOLESTR代替,尽管在C++它们是一样的,但是对于idl或者是COM调度,它们是不一样的。
    不敢说问题出在这里,但这至少是个规范。
      

  6.   

    受 jasn(春江雨)的启发,在get_Errstring中,把*pVal=Estring改为*pVal=Estring.Copy(),当时就很正常了,但第二天调试时,还是出现了类似的错误。
      

  7.   

    楼上的关于内存释放的问题,俺也同意。
    再:
    你最后用pADs->QueryInterface(IID_IADsUser,(void**)pVal);返回了指针,那么就要保证调用者(客户端程序)传递进来的参数*pVal必须是NULL再:为什么不用try{}catch{}捕获错误位置呢,配合日志输出,很容易就应该能判断出问题发生在哪里呀。
      

  8.   

    以前做个一个asp的组件,也是这样的问题!
    觉得注意一下HRESULT ADsOpenObject(
      LPWSTR lpszPathName, 
      LPWSTR lpszUserName, 
      LPWSTR lpszPassword, 
      DWORD dwReserved, 
      REFIID riid, 
      VOID** ppObject
    );
    函数里LPWSTR类型是否可以直接传入CComBSTR,没有主动转换,编译器能够正确做转换吗?
    那次是第一次做,也没研究清楚。
    再有就是lpMsgBuf,只是申明了一个指针,并没有明确分配内存就作为函数实参,??
    看不到全部代码,管窥