MSXML2 :: IXMLDOMDocument2 *의 정적 인스턴스를 사용하는 클래스를 내보내는 C++ dll (x.dll)이 있습니다.정적 인스턴스 MSXML2 :: IXMLDOMDocument2 * invaild
X.dll
에서wrapper.h
class EXPORTEDCLASS wrapper
{
wrapper();
public:
// Some accessor methods.
private:
PIMPL* pImpl;
};
wrapper.cpp
class PIMPL
{
public:
PIMPL();
static MSXML2::IXMLDOMDocumentPtr m_pDomDocument;
static s_bInit;
static void initDomDocument();
};
PIMPL::PIMPL()
{
initDomDocument();
}
void PIMPL::initDomDocument()
{
if(!s_bInit)
{
hr = CoCreateInstance(CLSID_DOMDocument40,NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument2, (void**)&m_pDomDocument);
m_pDomDocument->load(strFileName);
s_bInit = true;
}
}
wrapper::wrapper()
{
pImpl = new PIMPL();
}
m_pDomDocument은 어디 해제되지 않습니다. 그러나 일부 지역에서는 일부 로컬 스마트 포인터에만 할당되며 그 위치는 명시 적으로 해제되지 않습니다. 래퍼의 최초의 호출이 다른 DLL
m_pDomDocument 포인터가 생성이 시간의 DllMain에서 래퍼로 같은 모든 호출이 성공으로 제공되는 응용 프로그램에서
.또 다른 dll의 DllMain에서 다음 호출이 발생하면 s_bInit가 true이므로이 객체를 다시 생성하지 않습니다.
하지만 이번에는 어떻게 든 m_pDomDocument가 잘못되었습니다. (그 값은 첫 번째 호출과 동일하지만 해당 vptr은 유효하지 않습니다.)
여기서 어떤 문제가 생길 수 있습니까? COM 개체 생성이를 사용하여