RUNTIME_CLASS回来的指针为什么会变
RUNTIME_CLASS返回的指针为什么会变?
类定义:
class HVWEXT_EXT_CLASS CHyperExtDLL : public CDynLinkLibrary
{
DECLARE_DYNAMIC(CHyperExtDLL)
public:
CHyperExtDLL(AFX_EXTENSION_MODULE& state, BOOL bSystem = FALSE) :
CDynLinkLibrary(state, bSystem) {}
yourCHyperStaticData m_staticData;
};
同时定义了:
IMPLEMENT_DYNAMIC(CHyperExtDLL, CDynLinkLibrary)
初始化时调用:
void HvwInitModule()
{
// Insert this DLL into the resource chain
new CHyperExtDLL(HVWEXTDLL);
}
随后多次调用:
/*LPVOID*/ yourCHyperStaticData* HvwGetStaticData()
{
#if _MFC_VER >= 0x420
AFX_MODULE_STATE* pState = AfxGetModuleState();
#else
AFX_MODULE_PROCESS_STATE* pState = AfxGetModuleProcessState();
#endif
for (CDynLinkLibrary* pDLL = pState->m_libraryList; pDLL != NULL;
pDLL = pDLL->m_pNextDLL)
{
if (pDLL->IsKindOf(RUNTIME_CLASS(CHyperExtDLL)))
return /*(LPVOID)*/ &((CHyperExtDLL*) pDLL)->m_staticData;
}
ASSERT(0);
return NULL; // &m_staticData;
}
问题:
会出现在IsKindOf返回false的情况,而经调试pDLL的指针完全相同类名也相同,但是发现是RUNTIME_CLASS返回的指针不同导致,而如果Rebuild所有则可恢复正常,但不知道什么时候会在此出现此现象,哪位能解释???
------解决思路----------------------
1 是不是要 AFX_MANAGE_STATE
2 可能存在越界操作, 有数据被非法修改
------解决思路----------------------
当然会变,你这么编译每个项目都有一个静态变量的副本……
要共享runtime class的话,应该用扩展DLL项目
------解决思路----------------------
每个项目都有一个静态变量的副本所以地址不同。
不要在DLL接口里放包含静态变量的类型。
------解决思路----------------------
扩展DLL项目中RUNTIME_CLASS这个宏被展开为一个变量的导出所以可以用
既然你的runtime class报错说明你的DLL不是扩展DLL所以不支持跨DLL访问runtime class。
扩展DLL初始化的时候CDynLinkLibrary会注册一个CRuntimeClass列表
参考http://support.microsoft.com/kb/131946
类定义:
class HVWEXT_EXT_CLASS CHyperExtDLL : public CDynLinkLibrary
{
DECLARE_DYNAMIC(CHyperExtDLL)
public:
CHyperExtDLL(AFX_EXTENSION_MODULE& state, BOOL bSystem = FALSE) :
CDynLinkLibrary(state, bSystem) {}
yourCHyperStaticData m_staticData;
};
同时定义了:
IMPLEMENT_DYNAMIC(CHyperExtDLL, CDynLinkLibrary)
初始化时调用:
void HvwInitModule()
{
// Insert this DLL into the resource chain
new CHyperExtDLL(HVWEXTDLL);
}
随后多次调用:
/*LPVOID*/ yourCHyperStaticData* HvwGetStaticData()
{
#if _MFC_VER >= 0x420
AFX_MODULE_STATE* pState = AfxGetModuleState();
#else
AFX_MODULE_PROCESS_STATE* pState = AfxGetModuleProcessState();
#endif
for (CDynLinkLibrary* pDLL = pState->m_libraryList; pDLL != NULL;
pDLL = pDLL->m_pNextDLL)
{
if (pDLL->IsKindOf(RUNTIME_CLASS(CHyperExtDLL)))
return /*(LPVOID)*/ &((CHyperExtDLL*) pDLL)->m_staticData;
}
ASSERT(0);
return NULL; // &m_staticData;
}
问题:
会出现在IsKindOf返回false的情况,而经调试pDLL的指针完全相同类名也相同,但是发现是RUNTIME_CLASS返回的指针不同导致,而如果Rebuild所有则可恢复正常,但不知道什么时候会在此出现此现象,哪位能解释???
------解决思路----------------------
1 是不是要 AFX_MANAGE_STATE
2 可能存在越界操作, 有数据被非法修改
------解决思路----------------------
当然会变,你这么编译每个项目都有一个静态变量的副本……
要共享runtime class的话,应该用扩展DLL项目
------解决思路----------------------
每个项目都有一个静态变量的副本所以地址不同。
不要在DLL接口里放包含静态变量的类型。
------解决思路----------------------
扩展DLL项目中RUNTIME_CLASS这个宏被展开为一个变量的导出所以可以用
既然你的runtime class报错说明你的DLL不是扩展DLL所以不支持跨DLL访问runtime class。
扩展DLL初始化的时候CDynLinkLibrary会注册一个CRuntimeClass列表
参考http://support.microsoft.com/kb/131946