如何使用XPSP3下的VC++6.0制作以简单spider技术为核心的离线浏览器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用XPSP3下的VC++6.0制作以简单spider技术为核心的离线浏览器?相关的知识,希望对你有一定的参考价值。

毕业设计要求制作一个如题的程序,需求如下
使用mfc中的tear示例完成html下载,用html parser解析html(下载和解析可用别的方法)
使用深度优先遍历实现spider:自动一级一级地将所有文件(文字必须,图片等文件可选)下载到本地,并把所有链接改为本地链接,预计深度0~3
用C++编写简易浏览器,浏览下载下来的图片,文字,二进制文件,点击所有链接不访问网络,只在本地调用文件
以上
寻求高手帮助,如有想法请留Q
大家也可以简单评价一下这个课题的难度 一类本科水平论

希望以下程序能够帮助你

//write by wenhui.org
using System;
using System.IO;
using System.Text;
using System.Collections;

namespace PDFGenerator


public class PDFGenerator

static float pageWidth = 594.0f;
static float pageDepth = 828.0f;
static float pageMargin = 30.0f;
static float fontSize = 20.0f;
static float leadSize = 10.0f;

static StreamWriter pPDF=new StreamWriter("E:\\myPDF.pdf");

static MemoryStream mPDF= new MemoryStream();

static void ConvertToByteAndAddtoStream(string strMsg)

Byte[] buffer=null;
buffer=ASCIIEncoding.ASCII.GetBytes(strMsg);
mPDF.Write(buffer,0,buffer.Length);
buffer=null;


static string xRefFormatting(long xValue)

string strMsg =xValue.ToString();
int iLen=strMsg.Length;
if (iLen<10)

StringBuilder s=new StringBuilder();
int i=10-iLen;
s.Append('0',i);
strMsg=s.ToString() + strMsg;

return strMsg;


static void Main(string[] args)

ArrayList xRefs=new ArrayList();
//Byte[] buffer=null;
float yPos =0f;
long streamStart=0;
long streamEnd=0;
long streamLen =0;
string strPDFMessage=null;
//PDF文档头信息
strPDFMessage="%PDF-1.1\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="1 0 obj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="<< /Length 2 0 R >>\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="stream\n";
ConvertToByteAndAddtoStream(strPDFMessage);
////////PDF文档描述
streamStart=mPDF.Length;
//字体
strPDFMessage="BT\n/F0 " + fontSize +" Tf\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档实体高度
yPos = pageDepth - pageMargin;
strPDFMessage=pageMargin + " " + yPos +" Td\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= leadSize+" TL\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);

//实体内容
strPDFMessage= "(http://www.wenhui.org)Tj\n" ;
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage= "ET\n";
ConvertToByteAndAddtoStream(strPDFMessage);
streamEnd=mPDF.Length;

streamLen=streamEnd-streamStart;
strPDFMessage= "endstream\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);
//PDF文档的版本信息
xRefs.Add(mPDF.Length);
strPDFMessage="2 0 obj\n"+ streamLen + "\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="3 0 obj\n<</Type/Page/Parent 4 0 R/Contents 1 0 R>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="4 0 obj\n<</Type /Pages /Count 1\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Kids[\n3 0 R\n]\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/Resources<</ProcSet[/PDF/Text]/Font<</F0 5 0 R>> >>\n";
ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="/MediaBox [ 0 0 "+ pageWidth + " " + pageDepth + " ]\n>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="5 0 obj\n<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

xRefs.Add(mPDF.Length);
strPDFMessage="6 0 obj\n<</Type/Catalog/Pages 4 0 R>>\nendobj\n";
ConvertToByteAndAddtoStream(strPDFMessage);

streamStart=mPDF.Length;
strPDFMessage="xref\n0 7\n0000000000 65535 f \n";
for(int i=0;i<xRefs.Count;i++)

strPDFMessage+=xRefFormatting((long) xRefs[i])+" 00000 n \n";

ConvertToByteAndAddtoStream(strPDFMessage);
strPDFMessage="trailer\n<<\n/Size "+ (xRefs.Count+1)+"\n/Root 6 0 R\n>>\n";
ConvertToByteAndAddtoStream(strPDFMessage);

strPDFMessage="startxref\n" + streamStart+"\n%%EOF\n";
ConvertToByteAndAddtoStream(strPDFMessage);
mPDF.WriteTo(pPDF.BaseStream);

mPDF.Close();
pPDF.Close();

参考技术A spider网上代码蛮多的,说实话,如果自己做,还可以,如果要忽悠人也蛮简单的。 参考技术B 示例完成html下载,用html parser解析html 参考技术C 就这样 参考技术D dfcsddfvf

[转]PROC简单使用用例--VC连接ORACLE

操作系统:windows 7

数据库版本:oracle 10g

VS版本:VS2010

前言:连接ORACLE的方式有很多,此处仅以PROC为例,说明如何连接oracle,有不妥之处,望诸位看官指出,学习共进。

一、安装oracle 10g对应的客户端版本。

  注意事项:做好客户配置,以本机为例:D:\\oracle\\product\\10.2.0\\client_2\\NETWORK\\ADMIN\\tnsnames.ora文件为

# tnsnames.ora Network Configuration File: d:\\oracle\\product\\10.2.0\\client_2\\network\\admin\\tnsnames.ora
# Generated by Oracle configuration tools.

DB_DEMO =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.8.222)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = db_demo)
    )
  )

host:ORACLE服务端IP地址;PORT:ORACLE服务端端口号,默认为1521;SERVICE_NAME:数据库名称。

二、建立oracle.pc文件,文件内容为:

// oracle.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <stdlib.h>

#include <process.h> 
#include <errno.h> 

//EXEC SQL INCLUDE SQLCA;
#include <sqlca.h>

int main(int argc, char* argv[])
{
	EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR myusername[20], mypassword[20], myserver[20];
	EXEC SQL END DECLARE SECTION;

	printf( "\\n请输入用户名:" );
	gets( (char*)myusername.arr );
	myusername.len = (unsigned short) strlen( (char*)myusername.arr );
	printf( "\\n请输入口令:" );
	gets( (char*)mypassword.arr );
	mypassword.len = (unsigned short) strlen( (char*)mypassword.arr );
	printf("\\n请输入服务器名:");
	gets( (char*)myserver.arr );
	myserver.len = (unsigned short) strlen( (char*)myserver.arr );
	EXEC SQL CONNECT :myusername IDENTIFIED BY :mypassword USING :myserver;
	
	if(sqlca.sqlcode < 0 )
		printf (" \\n用户%s成功地连接到了服务器%s上!\\n" , myusername.arr, myserver.arr); 
	else
		printf("\\n%ld,%s\\n", sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
	return 0;
}

三、找到ORACLE安装目录下PROC.exe文件,本机目录为:D:\\oracle\\product\\10.2.0\\client_2\\BIN,将oracle.pc文件拷贝到些目录下,运行cmd命令行,cd到此目录下,运行proc.exe oracle.pc oracle.cpp命令,会在当前目录下生成oracle.cpp文件。

四、启动VS2010,建立空控件台的oracle项目,以下要注意了,做好VS项目配置。将oracle.cpp的拷贝至oracle目录下,添加进工程。然后做下图的配置:

1、数据库include头文件路径配置

2、数据库LIB文件目录配置

3、数据库依赖LIB文件配置

五、删除之前自动生成的oracle.cpp文件,将oracle.cpp添加进oracle项目,编译链接。可能会出现以下几个错误:

1、提示未include "stdafx.h"。解决方案:在oracle.cpp开始部位添加#include "stdafx.h"

2、提示 error LNK2001: unresolved external symbol "void __cdecl sqlcxt(void * *,unsigned int *,struct sqlexd *,struct sqlcxp const *)" (?sqlcxt@@YAXPAPAXPAIPAUsqlexd@@PBUsqlcxp@@@Z)错误。解决方案:extern  void sqlcxt (void **, unsigned int *,struct sqlexd *, const struct sqlcxp *);在extern后加上"C"编译即可

3、其它一些问题,就仔细查看配置的include、lib路径是否正确,以及lib文件名是否正确。

六、运行生成的oracle.exe。截图如下: