2007年4月20日星期五

JS取得问号?后的变量

JS取得问号?后的变量
<script>function QueryString(item){var sValue=location.search.match(new RegExp("[\?\&]"+item+"=([^\&]*)(\&?)","i"))return sValue?sValue[1]:sValue}
alert(QueryString("groupname"))alert(QueryString("id"))alert(QueryString("lp"))alert(QueryString("DaysPrune"))</script>

直接用 QueryString(argName) 这个函数来获取传递的参数就行了,location.search是获取?后面的整个字符串,利用JS正则表达式分析这个字符串并获取想要的结果.

2007年4月19日星期四

下雨

北京的天是干燥的,很少有下雨的时候,刚搬走不久有东西还落在朋友那里,
下午来的时候她拿了把伞告诉我,要下雨了,所以帮我拿来了,我有说不出的感动。

下雨的季节是属于我的季节,喜欢窝在被窝里听雨的声音,开开窗户伸手触摸
小雨的感觉,撑把伞走在大街上,或者任凭雨淋下,听着自己伤心的音乐,站在
青春的尾巴上,回头望,雨下的更大了

C# 自动填表 & 关于WebBrowser submit

公司上网首先需要安全认证,我嫌每次输入用户名、密码太麻烦,而我又使用IE7、Maxthon、firefox2等多种浏览器,所以决定自己写个自动填表的小程序让它开机运行。
用C#写这个东东非常简单,只需要用一个WebBrowser控件打开要自动填表的网页,然后找到特定的页面成员,赋值和触发事件就ok了。
首先分析目标页面:
《form name="LoginForm" method="get" action="http://10.245.×.×/login" onsubmit="'return">
《table width="253" border="0" cellspacing="0" cellpadding="0">
《tbody>《tr>
《td colspan="2">《img src="http://www2.blogger.com/image/login/login.gif" width="227" height="45" />《/td>
《/tr>
《tr>
《td colspan="2">
《table width="100%" border="0" cellspacing="0" cellpadding="0">
《tbody>《tr>
《td colspan="3">《/td>
《/tr>
《tr>
《td width="26">《img src="http://www2.blogger.com/image/login/useraccount.gif" width="21" height="25" />《/td>
《td>用户账号《/td>
《td width="158">《input type="text" name="username" size="20" maxlength="66">
《/td>
《/tr>
《tr>
《td width="26">《img src="http://www2.blogger.com/image/login/password.gif" width="21" height="25" />《/td>
《td>用户密码《/td>
《td width="158">《input name="password" type="password" id="password" size="20" maxlength="23">
《/td>
《/tr>
《input type="hidden" name="RecordPassword" value="on">
《input type="hidden" name="authmode" value="CHAP">
《input type="hidden" name="websuserip" value="10.245.113.32">
《input type="hidden" name="challenge" size="50" value="dhefbmmihpnfgmei">
《input type="hidden" name="submittime" value="0">
《/table>
《/td>
《/tr>
《tr>
《td height="17">《div align="center">
《input name="clear" type="button" value="清 除" onmouseout="this.style.backgroundColor='#D6EFFF'" onmouseover="this.style.backgroundColor='#94D8FF'" onclick="'return">《/div>《/td>
《td height="27">《div align="center">

《input name="submit" type="submit" height="27" value="登 录" onmouseout="this.style.backgroundColor='#D6EFFF'" onmouseover="this.style.backgroundColor='#94D8FF'">《/div>《/td>
《/tr>
《/table>
《/form>

可以知道,要做的就是给input成员username和password赋值,然后触发form的submit事件就可以。
不过,我在触发submit时遇到了一些问题,因为submit不是C#提供的常用的已注册事件,所以不能够通过RaiseEvent直接调用。
上穷碧落下黄泉,最后还是在一个国内的网站上找到了答案,可以通过AttachEventHandler("submit",new EventHandler(fun))给form添加事件处理函数fun,然后在fun中用InvokeMember方法调用页面中的响应函数,不过这样可能就不能submit页面到form的action定义的url了(偶没试)。
所以,用了改网站上提供的另外一种方法--使用InvokeMember调用input按钮submit的click事件,也可以达到触发form的submit的目的,虽然比较曲折,不过代码反而更简洁。
最后的C#代码如下:
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("http://10.245.*.*/"); //打开目标URL
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{ //webBrowser完成页面加载:
if (webBrowser1.Url.ToString() == "http://10.245.*.*/") //submit后还会加载一次,而所加载的页面“注销”按钮的name也是submit,汗,所以这要判断下
{
HtmlDocument doc = webBrowser1.Document; //获取document对象
HtmlElement btn = null;
foreach (HtmlElement em in doc.All) //轮循
{
string str = em.Name;

if ((str == "username") || (str == "password") || (str == "submit")) //减少处理
{
switch (str)
{
case "username": em.SetAttribute("value", "****"); break; //赋用户名
case "password": em.SetAttribute("value", "****"); break; //赋密码
case "submit": btn = em; break; //获取submit按钮
default: break;
}
}
}

btn.InvokeMember("click"); //触发submit事件
//doc.Forms["LoginForm"].InvokeMember("submit");
}
else //成功登陆后关闭
{
this.Close();
}
}

你知道这个绚丽的图片是什么吗?

Google 在线服务大全[62个更新中]

实用工具类
Gmail 邮件服务
Spreadsheets 电子表格处理软件
Writely 字处理软件
Blogger 博客空间
Blogger Beta 升级的博客空间
Measure Map 博客分析工具
Page Creator 在线网站设计工具
Reader 在线RSS阅读工具
Orkut 朋友圈
Joga 足球爱好者社区
Groups Google论坛
AdSense
赚钱的工具,发布google提供的广告
AdWords 通过google发布自己的广告
Analytics 强大的网站分析工具
bookmarks
在线的书签存储和管理
Web Albums
网路相册
Answers
需要付费的提问服务
Translate 翻译
Related
Links
能提供与你站点内容相关的信息
Co-op
Blog Ping 将你的blog提交给googleblog
search官方博客
Googleplex; 展示google的视频播客
谷歌黑板报 Google中国公司的博客站
Googleblog Google公司的博客站[英文]
Labs; 创意变成产品
Code 所有产品、服务开发相关的信息移动设备
PDA 移动设备上访问google
Gmail 手机上用收发邮件
Reader:移动设备上访问Reader:www.google.com/reader/m
Mobile 移动搜索
Short Message Service(SMS)
短信发送地图类
Maps 地图与卫星图浏览
Ride Finder
交通状况
Transit 旅行路线计划
Moon 月球图片
Mars 火星图片
资讯类
News 新闻
Finance 财经资讯站
Alerts 网络新闻定制服务
Google Nesletter
提供给粉丝们的快报搜索类
网页搜索 网页搜索[谷歌]
搜索特色
Google搜索的特色介绍
Trends
搜索趋势[中国]
Bendi 本地搜索商户
Bendi商户中心
添加自己的公司到本地搜索
大学搜索大学搜索[中国]
学术搜索 学术文章搜索[中国]
Press Center:
Zeitgeist
搜索趋势[英文]
Images 图片搜索
Notebook Search
搜索Notebook
Directory
Google索引目录
Stopbadware
反流氓软件组织,通过Google搜索访问流氓软件会看到google的警告!其他
Store Google商店
Romance 浪漫之
Imagelabeler
借以提高图像搜索的小游戏
WiFi
Google无线网络服务
Checkout
Google在线支付平台
Google.org Google的慈善机构
Gapminder
世界经济变化
Logo类
Holiday Logos
Fan
Logos

Official Logos

埃及怪胡子先生





在埃及有一个"独特胡子俱乐部",148名成员都留着长长的、造型奇特的胡子。图片为该俱乐部主任法特希·艾哈迈德·马哈茂德和他有趣的胡子。因为他们走到哪都很受欢迎,据说他们的胡子还起到了解决社会矛盾、调解居民不和、化解部族冲突的作用

挂msn也可以赚钱 领奖品 新鲜啊~~~

http://www.5sai.com/r.do?r=130339 有用msn的么 今天发现一个挂msn也可以赢取奖品的网站 呵呵 反正每天都挂着 注册下把msn的签名改成他们的广告就可以了 有兴趣的人可以看看 没有兴趣的人当个笑话 别k我

全国药品网(www.qgypw.com)介绍

网络科技日新月异,蕴藏着勃勃商机,令人心驰神往。医药市场买方与卖方已形成良性互动。互联网必将为医药行业商业模式的创新带来生机。 抢占先机,迎接挑战。作为信息传播领域的新兴力量,具备深远影响力的网络平台,电子商务以其穿越时空的讯捷能力,超越传统媒体,极具发展价值。为医药企业信息传播、品牌构建、资源整合,提供了一个高效的发展引擎,受到业内人士的青睐。全国药品网的横空出世,给医药市场带来一股全新的发展热潮。

全国药品网(www.qgypw.com)

由洪浪广告有限公司负责全方位的运营。以“协助医药企业成长,创造网络招商财富”为网站发展之根本,历经数年,精心打造,现以专业强势的医药招商网站风貌,与医药企业及代理商谋面,并谋求相识、相知。

信息创造财富,合作成就共赢。

全国药品网始终为您提供海量的医药招商信息、供求信息、市场动态、营销管理及实战方案,助您纵横于医界,驰骋于药市。

关注效果,联动你我。

我们的关联广告结合您的推广诉求,通过我们成熟的医药招商平台,精确方向,直达受众。我们帮您预先把控整体效果,为您提供投资回报最高的网络推广行销方案。

乾坤在握,决胜千里!
全国药品网(www.qgypw.com)地 址: 北京西城区
客服 QQ: 378845822客服邮箱: topren8848@163.com

2007年4月18日星期三

这些图片给人无限的遐想 一句话---美!





把.NET程序部署到没有安装.NET Framwork的机器上

摘要

本文讨论了如何使用Windows Installer技术发布.NET程序,以及如何使用native代码判断目标机器上是否安装有.NET Framework; 如果没有,将自动安装.NET Framework然后安装作者自己的.NET程序。

--------------------------------------------------------------------------------

目录

本文内容

制作自己的安装程序

发布.NET Framework

制作自己的native安装程序

使用方法

总结

作者

--------------------------------------------------------------------------------

本文内容

1. 使用VS.NET来制作安装程序。

2. 如何把.NET Framework 部署到目标机器。

3. 如何使用Native代码把.NET Framework和自己的安装程序制作为一个统一的安装程序。该程序做到如果目标机器上没有.NET Framework,将自动安装.NET Framework然后再自动安装作者自己的程序。

--------------------------------------------------------------------------------

制作自己的安装程序

在VS.NET中,我们可以通过建立"Setup and Deployment Projects"项目,非常灵活方便的把自己的.NET程序制作为Windows Installer文件。比如,我们可以很方便的定制下面这些选项:

1. 是否在桌面上放置快捷方式。

2. 注册自己的文件类型,可以通过双击该文件来使用自己的程序打开。

3. 注册表的处理

在下面的MSDN站点,我们可以获得在VS.NET中通过Setup and Deployment Projects来制作自己的安装程序的示例:

http://msdn.microsoft.com/library/en-us/vsintro7/html/vbconDeploymentScenarios.asp

--------------------------------------------------------------------------------

发布.NET Framework

.NET Framework 1.0提供一个用来重新部署.NET的exe文件:Dotnetfx.exe. 它包含了Common Language Runtime和其它.NET程序运行时必不可少的内容。

我们可以从下面的站点下载该exe文件:

http://msdn.microsoft.com/downloads/sample.asp?url=/MSDN-FILES/027/001/829/msdncompositedoc.xml

同时,我们也可以在VS.NET安装CD或者DVD中找到该文件。

我们可以通过多种方式来通过运行Dotnetfx.exe把.NET Framework部署到目标机器上:

来源:CSDN

作者:未知

关键字:RAM,work


1. 通过Microsoft Systems Management Server部署。

2. 通过Active Directory部署。

3. 使用第三方工具。

具体的信息,我们可以参阅下面的文章:

http://msdn.microsoft.com/library/en-us/dnnetdep/html/redistdeploy.asp

--------------------------------------------------------------------------------

制作自己的native安装程序

如果我们要把自己的.NET程序发布到目标机器上,同时我们不确定该目标机器是否已经安装了.NET Framework, 那我们就需要自己设计一段unmanaged代码,来判断目标机器是否安装了.NET Framework, 如果没有,则运行Dotnetfx.exe安装.NET Framework, 然后利用Windows Installer安装自己的程序。

在MSDN的下面网页上,我们可以获得一个使用unmanaged C 实现的安装程序和它的源代码:

http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/830/msdncompositedoc.xml

1. 在CSettings class中,通过读取"settings.ini",获得您自己的MSI安装文件和dotnetfx.exe的路径,以及其他您自己的设置。(比如.NET Framework的语言版本)

GetCaptionText(void)

GetDialogText(void)

GetErrorCaptionText(void)

GetIniName(void)

GetProductName(void)

Parse()函数用来解析settings.ini文件。

2. 在Main.cpp文件中,全局函数FxInstallRequired()判断是否要在目标机器上安装.NET Framework. FxInstallRequired()会检测下面的注册表键值和dotnetfx.exe的版本和语言设置。

HKLM\SOFTWARE\Microsoft\.NETFramework\policy\v1.0

3.如果需要安装.NET Framework, 在全局函数ExecCmd()中调用下面的命令silent安装dotnetfx.exe:

dotnetfx.exe /q:a /c:"install /l /q"

4。 在ExecCmd()全局函数中调用下面的命令安装您自己的MSI文件:

msiexec /i REBOOT=ReallySuppress

--------------------------------------------------------------------------------

使用方法

如果我们使用上面的native代码作为自己的安装程序,那么我们可以通过下面的步骤把自己的.NET程序和它结合在一起:

来源:CSDN

作者:未知

关键字:RAM,work


1.把您自己的.NET程序制作成为Windows Installer (.MSI)文件。

2.打开"settings.ini"文件,在"Msi" key中设置您自己的.NET程序的MSI文件路径和文件名;在"FxInstallerPath" Key中,设置dotnetfx.exe的路径。具体的参数信息,您可以从下面文章中得到:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy.asp

3. 把"setup.exe", "settings.ini", "dotnetfx.exe"和您自己的MSI安装文件,发送到目标机器上,然后运行"setup.exe", 安装程序会自动检测是否有.NET Framwork, 如果没有,将首先运行dotnetfx.exe。

通过上述步骤,您可以将自己的.NET程序成功的部署到没有安装.NET Framwork环境的机器上。

--------------------------------------------------------------------------------

总结

通过上述步骤,您可以将自己的.NET程序成功的部署到没有安装.NET Framwork环境的机器上。

--------------------------------------------------------------------------------

C#多线程

在多线程编程中,我们经常要使用数据共享.C#中是如何实现的呢?很简单,只要把你要共享的数据设置成静态的就可以了.关键字static .如下:
static Queue q1=new Queue();
static int b=0;
在这里我定义了一个整形变量b和队列q1.
接下去就可以创建多线程代码了.如下:
MyThread myc;
Thread[] myt;
myt=new Thread[10];
myc=new MyThread();
for(int i=0;i<10;++i)
{
myt[i]=new Thread(new ThreadStart(myc.DoFun));
// System.Console.WriteLine("<<{0}>>",myt[i].GetHashCode());
myt[i].Start();
Thread.Sleep(1000);
}
你可能惊奇的发现这里使用了一个类实例myc.在起初的设计中我使用了MyThread数组,对于本例来说这没有什么关系,当线程要使用不同的操作时,那就要使用其他的类实例了.

以下是完整的代码:
using System;
using System.Threading;
using System.Collections;
namespace shareThread
{
class MyThread
{
static Queue q1=new Queue();
static int b=0;
public void DoFun()
{
lock(this)
{
++b;
q1.Enqueue(b);
}
System.Console.WriteLine("B:{0}--------------",b);
PrintValues( q1 );

}
public static void PrintValues( IEnumerable myCollection )
{
System.Collections.IEnumerator myEnumerator = myCollection.GetEnumerator();
while ( myEnumerator.MoveNext() )
Console.Write( "\t{0}", myEnumerator.Current );
Console.WriteLine();
}
}
///
/// Class1 的摘要说明。
///
class ClassMain
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main(string[] args)
{
MyThread myc;
Thread[] myt;
myt=new Thread[10];
myc=new MyThread();
for(int i=0;i<10;++i)
{
myt[i]=new Thread(new ThreadStart(myc.DoFun));
// System.Console.WriteLine("<<{0}>>",myt[i].GetHashCode());
myt[i].Start(); //线程运行
Thread.Sleep(1000);//主线程睡眠 } System.Console.Read();//等待完成,dos窗口不会马上关闭了. } }}(完)