蛋疼的小问题。。DLL编译出的Release版本放在所加载的工程中运行出错,Debug版本加载后运行完全OK。。各位英雄进来瞧一瞧。。
写了一个DLL。。。编译出两个版本。。Debug的xxxD.dll 和 Release的xxx.dll。。。。静态加载到工程中:
#ifdef _DEBUG
#pragma comment(lib,"../lib/IBODllD.lib")
#else
#pragma comment(lib,"../lib/IBODll.lib")
#endif
然后工程用Debug版本运行OK。。。换成Release版本后运行。。break在下面函数:
inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
EnterCriticalSection(&m_sect);
ASSERT(nSlot != 0 && nSlot < m_nMax);
ASSERT(m_pSlotData != NULL);
ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);
ASSERT(m_tlsIndex != (DWORD)-1);
if( nSlot <= 0 || nSlot >= m_nMax ) // check for retail builds.
{
LeaveCriticalSection(&m_sect);
return NULL;
}
CThreadData* pData = (CThreadData*)TlsGetValue(m_tlsIndex);
if (pData == NULL || nSlot >= pData->nCount)
{
LeaveCriticalSection(&m_sect);
return NULL;
}
void* pRetVal = pData->pData[nSlot];
LeaveCriticalSection(&m_sect);
return pRetVal; (错误信息箭头指向此处!!!!!!!!!!!!!)
}
弹出的break窗口显示信息为:
Unhandled exception at 0x7c812aeb in HQ1Control.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012d2b0..
敢问各位英雄,这是为何咧。。。。。。。。。。。。
[解决办法]
如果你是先运行Debug,然后改为Release,而且你的DLL没有直接设置默认加载地址,那么你Release版本在加载的时候地址是要重定向的
[解决办法]
系统退出时,为什么会调用GetThreadValue呢?
[解决办法]
我觉得问题出在指针超界,破坏了栈的原因。
错误定位在一个函数退出的地方,应该就是调用函数后试图恢复函数之前的各个寄存器变量的时候出错了,这个时候是不是各个寄存器被乱飞的指针破坏了呢?
debug好用,因为debug会将所有new出来的控件进行CDCDCDCD处理,而release不会