疑惑,使用WinInet函数在DLL里面,在FreeLibrary执行的为什么这么慢?

seesi 2005-06-13 11:14:11
我在我的一个DLL工程里面调用了WinInet的相关函数。如下面所示
int PostInfo(const char* cpszServerAddress, void* pvSend, int nSendSize, void* pvReturn, int* pnReturnSize)
{
bool bResult = false;
int nRetcode = false;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequst = NULL;
char szReadBuf[4096] = {0};
int nRead = 0;


hSession = ::InternetOpen("MyAgent",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0);
if (!hSession)
{
goto Exit0;
}

hConnect = ::InternetConnect(hSession,
cpszServerAddress,
INTERNET_DEFAULT_HTTP_PORT,
"",
"",
INTERNET_SERVICE_HTTP,
0,
1);
if (!hConnect)
{
goto Exit0;
}

hRequst = ::HttpOpenRequest(hConnect,
"POST",
"test.asp",
HTTP_VERSION,
NULL,
0,
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD,
1);
if (!hRequst)
{
goto Exit0;
}

nRetcode = ::HttpSendRequest(hRequst, NULL, 0, pvSend, nSendSize);
if (!nRetcode)
{
goto Exit0;
}

nRetcode = ::InternetReadFile(hRequst, szReadBuf, sizeof(szReadBuf) - 1, (LPDWORD)&nRead);
if (!nRetcode || nRead == 0)
{
goto Exit0;
}

*(char*)(szReadBuf + nRead) = NULL;

memcpy(pvReturn, szReadBuf, *pnReturnSize);

*pnReturnSize = nRead;

bResult = true;

Exit0:

if (hRequst)
{
InternetCloseHandle(hRequst);
}

if (hConnect)
{
InternetCloseHandle(hConnect);
}

if (hSession)
{
InternetCloseHandle(hSession);
}

return bResult;
}

我使用另外的一个EXE工程,LoadLibrary把该DLL动态Load进来,调用该DLL的导出函数PostInfo,很快就返回正确的数据了。但是当我的EXE在调用FreeLibrary的时候却要很长时间才返回(30秒左右),这段时间内界面也会失去响应。有什么解决的办法吗?
...全文
332 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
会思考的草 2005-06-13
  • 打赏
  • 举报
回复
还有就是你的整个代码质量不是很好。改用try、catch可能要可靠一些;或者封装成一个class,把建立连接的工作放到构造函数里,把关闭连接的函数放到析构函数里,用C++的语法保证建立连接和销毁连接可以成对进行。
会思考的草 2005-06-13
  • 打赏
  • 举报
回复
Free之前最好再显式地关闭连接,我不知道这30s是不是windows在尝试关闭连接。
seesi 2005-06-13
  • 打赏
  • 举报
回复
顶阿,好高分数的阿
seesi 2005-06-13
  • 打赏
  • 举报
回复
噢。不知什么原因。在我的机器上确实非常FreeLibrary的时候慢。我另外一台机器上倒是很快。
会思考的草 2005-06-13
  • 打赏
  • 举报
回复
我建议楼主把编译好的项目拿到干净的机器上去试验一下.这些莫名其妙的问题有时候是windows造成的.
会思考的草 2005-06-13
  • 打赏
  • 举报
回复
我这边速度可以啊,没有任何延迟.
seesi 2005-06-13
  • 打赏
  • 举报
回复
莫名其妙的问题在心里不解决总是不爽?大家示范一下是否也遇到这样的问题。
柯本 2005-06-13
  • 打赏
  • 举报
回复
我的意思不是将DLL变成静态的lib,而是用dll生成的lib调用dll,不用LoadLibray/FreeLibrary
seesi 2005-06-13
  • 打赏
  • 举报
回复
各位大侠可以自己试验一下看看是否是我说的如此。
seesi 2005-06-13
  • 打赏
  • 举报
回复
我跟踪发现,其挂住是在DllMain退出以后。
seesi 2005-06-13
  • 打赏
  • 举报
回复
使用LIB的话,都整个程序结构破坏比较大,因为很多模块都会调这个DLL,编译和分发都不方便。另外DllMain没有任何代码。
shines77 2005-06-13
  • 打赏
  • 举报
回复
检查下DllMain的DLL_PROCESS_DETACH里你做了些什么,是不是有InternetCloseHandle、WaitForSingleObject()或者其他
柯本 2005-06-13
  • 打赏
  • 举报
回复
不用LoadLibray/FreeLibrary,用lib加入工程试试.
seesi 2005-06-13
  • 打赏
  • 举报
回复
InternetCloseHandle(hRequst)就是相当于StopRead了。InternetCloseHandle(hConnect);就是关闭连接了。InternetCloseHandle(hSession);是关闭Session了。
seesi 2005-06-13
  • 打赏
  • 举报
回复
不知大家明白了我的意思了没有,我的上面这个函数是我一个DLL的导出函数。我使用LoadLibray加载我的Dll,执行这个导出函数。执行完成之后,调用FreeLibrary释放我的DLL,这时候就在FreeLibrary中函数卡住了大约30秒左右的时间。才从这个函数返回。但是我直接把这个函数移动到EXE工程中,执行完成之后程序退出都很快完成了。
seesi 2005-06-13
  • 打赏
  • 举报
回复
但是我把这个函数直接移到EXE的工程里面,执行完成之后,EXE很快就退出了。
seesi 2005-06-13
  • 打赏
  • 举报
回复
返回是很快就返回了。就是卡死在FreeLibrary里面。
seesi 2005-06-13
  • 打赏
  • 举报
回复
什么办法都试验过了。写成类也没有用。
shines77 2005-06-13
  • 打赏
  • 举报
回复
如果想快速的返回,最后使用WinInet的异步连接方式,不过处理就麻烦一点
老夏Max 2005-06-13
  • 打赏
  • 举报
回复
应该清楚一些东西以后才能Free把,呵呵,比如Close,StopRead等等。
就像线程退出一样,有可能其正在做的是一个原子操作,所以只能等待。除非提供了相关的强制关闭的API!
加载更多回复(1)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧