首页
社区
课程
招聘
[求助]gethostbyname崩溃
发表于: 2013-4-28 00:40 9293

[求助]gethostbyname崩溃

2013-4-28 00:40
9293
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下的报错截图和可执行文件在附件中,麻烦各位大哥了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 546
活跃值: (1637)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
你用了squid?你的汇编代码明显和你写的代码不一样,建议你重新设置一下vc的环境变量,重新编译,就那么几句话,你能编译出一个1M多的dll,你还能忍受
上传的附件:
2013-4-28 09:31
0
雪    币: 721
活跃值: (3782)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=我是土匪;1171457]你用了squid?你的汇编代码明显和你写的代码不一样,建议你重新设置一下vc的环境变量,重新编译,就那么几句话,你能编译出一个1M多的dll,你还能忍受
[/QUOTE]
非常感谢您的回复!

你用了squid?
:是用了squid

你的汇编代码明显和你写的代码不一样
:在Win7下printf("gethostbyname success:%s\n", szHostName);这句是可以打印信息的,没看出哪里不一样啊,难道被编译器代码修改过了,求指教!

就那么几句话,你能编译出一个1M多的dll,你还能忍受
:dll中不仅仅有cache这个函数,还有其他很多squid的代码,只是不是导出函数而已,代码是用debug模式编译的,1M多很正常的啊!
2013-4-28 10:51
0
雪    币: 29221
活跃值: (7734)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
4
__declspec(thread) and DLLs
Thread-local variables work for EXEs and DLLs that are statically linked to the main executable (directly or via another DLL) - i.e. the DLL has to load before the main executable code starts running.

看来不能用LoadLibrary,  得用这种#pragma comment(lib, "xx.lib")

================================================================
难怪..
squid-3.3.4\compat\os\mswin.h

SQUIDCEXTERN THREADLOCAL int ws32_result;

#define THREADLOCAL __declspec(thread)

#define gethostbyname(n) \
	(NULL == ((HOSTENT FAR*)(ws32_result = (int)gethostbyname(n))) ? \
	(errno = WSAGetLastError()), (HOSTENT FAR*)NULL : (HOSTENT FAR*)ws32_result)
2013-4-28 11:13
0
雪    币: 721
活跃值: (3782)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=风间仁;1171505]把用到tls的代码贴出来看看(紧接着gethostbyname的那句), 有点奇怪怎么会用到fs:[2C][/QUOTE]

感谢回复!难道是编译器做了手脚,代码如下
__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;

}

2013-4-28 11:34
0
雪    币: 721
活跃值: (3782)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
万分感谢,按照大侠说的做了果然可以了,哈哈!请问你说的相关知识叫什么来着,有空学习下!
2013-4-28 13:17
0
游客
登录 | 注册 方可回帖
返回
//