我用MFC Regular DLL 写了一个DLL,在里面应用了多线程
UINT CSocketClient::ThreadStart(LPVOID pParm)
{
CCriticalSection threadcs;

threadcs.Lock();
         CSocketThread socket;
if(!socket.Create())
    return 1;
if(!socket.Connect("10.90.128.24",1500))
return 2;
socket.SendFun();
threadcs.Unlock();
return 0;
}int CSocketClient::ThreadFun()
{
AfxBeginThread(ThreadStart,this);
return 0;}
当我程序执行到(!socket.Create())变会出现异常(Unhandled exception in vb6.exe(socksend.dll)0xc0000005,Access violation) ,
void* CMapPtrToPtr::GetValueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
if (m_pHashTable == NULL)
return NULL;这个DLL是用在vb中 
如果我把他换成USE MFC A Share DLL的话,就没什么问题了。不知道是什么原因
2、在线程中访问数据库为什么路径老是不对,不在线程中就可以了那
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Para.mdb","","",adModeUnknown);谢谢大家

解决方案 »

  1.   

    http://support.microsoft.com/kb/194300/en-usAFX_MANAGE_STATE(AfxGetStaticModuleState());
     CSocketThread socket;
    if(!socket.Create())
        return 1;
      

  2.   

    2. DataSource=Para.mdb  用绝对路径
      

  3.   

    先看看是不是下面文章里的原因
    http://support.microsoft.com/kb/193101/en-us
      

  4.   

    1 CSocket只能在GUI线程中创建,MS的CSocket一般不是用来支持多线程的,因为MFC封的这个类使用了事件(窗口消息)这种I/O模型,并自己建了一个隐藏的窗口来收这些消息(类似于COM中的套间线程)。 建议放弃了CSocket,自己封了一个效果也许更好。如果在一个线程中创建socket,很容易发生Assert(m_hSockWnd != NULL)的问题。如果一定要用,可以参考
    Message-Oriented TCP and Multithreaded Client/Server
    http://support.microsoft.com/kb/192570/en-us2 在每个线程里都进行com库的初始化