VC 的有关 COM 的网络编程问题,百思不得其解,望高手想相助。

nkwen 2000-08-18 08:08:00
  我用VC编写了一个COM代码组件,使用 VC 的 Appwizard 生成了带有支持 windows socket 和 automation 的 DLL 框架,添加类及接口,用以实现类似于 asphttp 的功能,查看 网页 文件和向 网页文件提交数据,我的 组件在VB中 用 Createobject 能够正确调用其属性和参数,但是存在三个问题:
1。 程序在查看 8K 以下的文件,没有问题。但是如果网页文件的字节大于8K ,程序有时不能查看,有时能查看(我曾有几次可以,昨天晚上3点左右,程序查看小于64K 的网页文件也没有问题),程序工作不稳定。 但是程序执行为什么依时间而定?为何这么不稳定?为什么大于64K 的网页文件不能返回?(程序只返回前64K。)
2。 有关COM的问题。在COM中的参数的调用和返回在内部都是采用VARIANT类型,问题1的64K上限会不会与组件方法的的返回值类型有关?除了VARIANT 类型,组件的方法的返回值能使用其他的返回值类型吗?(如char*,CString, 我试过的,好象不行?)
3。 我是使用的 wininet 类进行编程的,在组件方法实现的文件头部添加 include <afxinet.h> ,工程文件中添加 wininet.lib 库文件,但是如果使用 POST 方法,我的要发送的数据应该放在哪个函数的哪个参数中,还是使用InternetWriteFile 方法?
组件的GetURL 方法的代码贴在下面。
因为我手头的资料不多,任务又急,望高手不吝指教,小弟先谢过了。

VARIANT Cconn::GetURL()
{
VARIANT vaResult;
VariantInit(&vaResult);
// TODO: Add your dispatch handler code here

CString sUrl;
sUrl=m_Url;
if(sUrl.IsEmpty() and and sUrl.Left(7)!="http://")
{
TRACE("Sorry, it's wrong\n");
}

// begin to parse url string
if(sUrl.IsEmpty())
{
TRACE("Sorry, please set url string \n");
}
CString strTemp = sUrl.Mid(7);
int nSlash = strTemp.Find("/");
if(nSlash != -1)
{
m_strServer = strTemp.Left(nSlash);
m_strPath = strTemp.Mid(nSlash);
}
else
m_strServer = strTemp;


HINTERNET hSession = ::InternetOpen("HTML Reader",
PRE_CONFIG_INTERNET_ACCESS,"",
INTERNET_INVALID_PORT_NUMBER,0);

if(hSession == NULL)
{
TRACE("HINTERNET is wrong\n");
// return;
}

HINTERNET hConnect = ::InternetConnect(hSession,m_strServer,
INTERNET_INVALID_PORT_NUMBER,"","",
INTERNET_SERVICE_HTTP,0,0);

if(hConnect == NULL)
{
TRACE("hConnect is worng\n");
// return;
}

// CString aa;
// aa.Format("default11.htm");
HINTERNET hHttpFile = ::HttpOpenRequest(hConnect,"GET",
m_strPath,HTTP_VERSION,NULL,0,
INTERNET_FLAG_DONT_CACHE,0);

if(hHttpFile == NULL)
{
TRACE("hHttpFile is worng\n");
VERIFY(::InternetCloseHandle(hConnect));
VERIFY(::InternetCloseHandle(hSession));
// return;
}

BOOL bSendRequest = ::HttpSendRequest(hHttpFile,NULL,0,0,0);

if(bSendRequest)
{
char achQueryBuf[16];
DWORD dwFileSize;
DWORD dwQueryBufLen = sizeof(achQueryBuf);
BOOL bQuery = ::HttpQueryInfo(hHttpFile,
HTTP_QUERY_CONTENT_LENGTH,achQueryBuf,
&dwQueryBufLen,NULL);
if(bQuery)
dwFileSize = (DWORD)atol(achQueryBuf);
else
dwFileSize = 10 * 1024;

char* lpszBuf = new char[dwFileSize+1];

DWORD dwBytesRead;
BOOL bRead = ::InternetReadFile(hHttpFile,lpszBuf,
dwFileSize+1,&dwBytesRead);

m_strContent=lpszBuf;

delete lpszBuf;

VERIFY(::InternetCloseHandle(hHttpFile));
VERIFY(::InternetCloseHandle(hConnect));
VERIFY(::InternetCloseHandle(hSession));
}

vaResult.vt=VT_BSTR;
vaResult.bstrVal=m_strContent.AllocSysString();
return vaResult;

}

...全文
187 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhq2000 2000-10-03
  • 打赏
  • 举报
回复
1.可能是网络问题,晚上网络不拥挤;传送大文件时,因网络拥挤,可能会失去连接。
2.与返回类型无关,CString可分配大内存,COM只有VARIANT类型。
3.对于POST,使用OpenRequest之后,用SendRequestEx发送POST数据长度,InternetWriteFile发送POST数据,EndRequest结束POST数据。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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