TestDll.exe调用cache.dll中的导出函数cache,在Win7下工作正常,但是在XP下执行到gethostbyname就会崩溃,如果把cache.dll编译为EXE那么cache函数在Win7和XP下都能正常,用户要求cache函数必须要在DLL中实现。
cache函数很简单:__declspec(dllexport) BOOL cache()
{
char szHostName[128] = "netscape.com";WORD wVersionRequested;
WSADATA wsaData;
int err;wVersionRequested = MAKEWORD( 2, 0 );err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 1;
}
if (gethostbyname(szHostName) != NULL)
{  printf("gethostbyname success:%s\n", szHostName);
return 1;
}
else
{
printf("gethostbyname fail:%s\n", szHostName);
}
printf("After call gethostbyname\n");
return TRUE;}在XP下的报错截图和可执行文件在附件中,麻烦各位大哥了gethostbyname crash 

解决方案 »

  1.   

    附件下载地址http://download.csdn.net/detail/jamseyang/5309942
      

  2.   

    wVersionRequested = MAKEWORD( 2, 0 );
    设为1.1试试。
      

  3.   

    不会是因为编译设置的环境不一样导致的吧/MT /MTd等等
      

  4.   

    gethostbyname内部应该会new一个struct hostent,如果在这之前堆被破坏过,在debug版本下这个new会检查到这个被破坏的堆并且产生一个断点异常.你先看看异常的信息是什么,是access violation还是别的.
      

  5.   

    东西下载过了,貌似没帮助啊。实在不行调用的cache的时候弄个LPCTSTR,把gethostname的值作为参数放入
      

  6.   

    感谢大家的回复!应该不是这个问题,编译的EXE运行没有问题说明winsock版本没有问题的我试试哈远程调试了,异常是access violation
    我试过了,没用的
      

  7.   

    DLL传值错误?怎么可能传不进去?
      

  8.   

    我的建议是首先要确定这个问题是概率事件还是一定会发生的,如果是一定发生,在你的机器上重现这个问题,挂上调试器,异常时直接看栈,必要时下载系统dll的pdb帮助分析.
      

  9.   

    再次感谢大家的回复,问题已在看雪论坛里的大牛帮助下解决了http://bbs.pediy.com/showthread.php?t=170632