疑惑,使用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秒左右),这段时间内界面也会失去响应。有什么解决的办法吗?
...全文
349 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
我正在网上搜刮了一下没发明相干的东西, 因而本身出手翰单真现这听命, 而今phpMyAdmin3.2.5,phpMyAdmin3.2.1、phpMyAdmin2.11.2版本测试均成功! 此东西仅供网友技术进修交换利用,请勿利用于犯警用处。 MySQL数据库字典,人人就本身网上支散了! 当前版本 v1.2 MD5:541465699949f3d60fcea923ccf245b2 sha1:e23d7ce46606d530abc4a9e473bdb0b5247aaff1 – ver1.2 措置对phpMyAdmin3.2.5版本暴破有标题问题,删加了一个工作线程, 美化了界面。 – ver1.1 1.0版本有个标题问题,正在win7、vista下都不能正常扫描, 现曾纠正过往。 ————————————————— 技术总结: 《vc6建正删除cookie真现》 InternetSetCookie函数太老,能建正一般cookie值,但是正在win7下高版本Wininet.DLL中无法让HTTPONLY类型的cookie过时, 要利用InternetSetCookieEx函数才成功,正在vs2010下直接用该函数,vc6下本身加载模块查找函数, vc6下查找利用该函数删除cookie以下: HINSTANCE hInst = LoadLibrary(“Wininet.DLL”); if(hInst) { typedef BOOL (WINAPI *pfnInternetSetCookieEx)(LPCSTR, LPCSTR, LPCSTR, DWORD, DWORD); pfnInternetSetCookieEx InternetSetCookieEx = NULL; InternetSetCookieEx = (pfnInternetSetCookieEx)GetProcAddress(hInst, “InternetSetCookieExA”); //InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); FreeLibrary(hInst); } 寄看,要分隔设置cookie字段,不能一次设置多个字段,不然不成功,下面的语句只要第一个字段被设置成功,其它字段均不成功! InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; pma_mcrypt_iv=; pmaUser-1=; pmaPass-1=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); 精确理当如许写, InternetSetCookieEx(m_url, NULL, ” phpMyAdmin=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” pma_mcrypt_iv=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” pmaUser-1=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); InternetSetCookieEx(m_url, NULL, ” pmaPass-1=; expires=Thu, 01-Jan-1900 00:00:01 GMT”, INTERNET_COOKIE_HTTPONLY, NULL); 1>

18,363

社区成员

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

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