种种原因,暂时搁浅了blog的内容,以后逐步充实内容。
posted @
2008-08-12 09:48 work 阅读(8) |
评论 (0) |
编辑
USING EXTPWD
------------
Before using EXTPWD, you should copy the EXTPWD program to the Notes
executable directory, which is the directory containing the Notes program
files and libraries. The name of the EXTPWD program DLL or shared library
depends on the platform, as follows:
nextpwd.dll 32-bit Windows
libextpsw.so Solaris SPARC and Intel Editions
You also need to instruct Notes to load the EXTPWD program by adding one
of the following entries to notes.ini, the Notes environment file (do this
before starting Notes):
PC platforms: EXTMGR_ADDINS=extpwd
Solaris: EXTMGR_ADDINS=libextpsw.so
When Notes requires a password, it will read the password from a text file
called password.txt in the Notes data directory. Be sure to create this
file in the Notes data directory before using EXTPWD.
Note: The main entry point in the EXTPWD program is called by Notes when
Notes starts, and should NOT be called from your own application code.
You can test that the EXTPWD is working correctly by starting Notes after
performing the steps described above. You should find that you are not
prompted for your password in circumstances where you would have been
prompted without using EXTPWD, for example when first accessing a remote
database.
Once you establish that your Notes client no longer prompts you for a
password, you should be able to run any Notes C or C++ API application
without being prompted for a password.
As mentioned above, keeping an unencrypted password in a text file is not
recommended for a real application, because it makes the password available
to anyone with access to the file.
这是IBM官方提供的解决方案,我将提供给大家nextpwd.dll解决这个问题。
The DLL:http://files.cnblogs.com/al-zerone/notesnopass.zip
posted @
2008-08-12 09:44 work 阅读(40) |
评论 (0) |
编辑
A. Windows server 2008 微软发布了相当长一段时间了,一直没有机会试用,有幸因工作需要进行研究配置,无奈本人技术有限,在研究配置的同时写下相关文档,供新手参考使用。
B. (本人研究配置的只于本人工作需要有关,其他的一些相关研究大家可以email于我共同探讨)
C. 试用安装前提:
申请微软windows server 2008 试用key---只要具有微软live ID即可,在微软官方网站下载使用,至于网上很多经过修改的版本建议大家三思后再下载,如果你只是简单的使用体验那无妨,如果作为服务器进行配置试用,还是官方的好些。
至于安装给大家提个醒---第一次安装的时候,选择language(不幸选择了english@.@!!!锻炼英语。。。),在以后的使用中肯定需要安装一些中文软件进行支持,到时还得进行调试并且会比较麻烦,因此建议大家直接安装选择chinese(PRC)。
(另外刚开始安装不需要输入key进行激活,默认的是3天试用,你申请的key可以稍后激活,下文将给出激活位置。)
D.安装过程相当简单,相当于无人安装,以前xp 03系列的安装选择regional...都在最开始配置完毕了,并且2008支持几乎大部分的驱动,因此不必担心驱动的问题。
下面是安装好的logon界面:

E. 登陆界面后,熟悉03的都知道会弹出一个服务器的配置界面,08的同样具备,不过08更为人性化和专业化,具备了set time zone;configure networking;Provide....(下图)

这个界面进行简单的配置即可正常使用Server 2008,虽然都是英文但是都非常简单,相信大家多几次click就ok了。
F. 下面将详细介绍 Configure networking,Add roles,Add features,Enable Remote Desktop,以及Configure Windows Firewall
Configure networking—相信一定有人说网络配置就不用说了吧。。。用过操作系统的都知道。呵呵,话是不错,不过这里不再介绍ipv4的配置,即正常的ip配置,但是还是需要配置进行连网的,因为server 2008已经内置并公开支持ipv6,默认是已经安装的,因此介绍ipv6的配置。
这个的前提是ipv4已经配置完毕,而对于有些需要支持ipv6的局域网,最最简单的配置。。。(别板砖我,我说了是对于新手而言的。)

如上图设置,address--fec0:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaa1
同理局域网内的其他机器相应的为...:aaa2;...:aaa3注意是16进制。
(请关注陆续系列,希望大家共同探讨,email,workwang@gmail.com)
另召集系统网络安全高手,莫非阁下是传说中的红客。。。email我吧,学习交流合作。
posted @
2008-03-10 14:44 work 阅读(323) |
评论 (2) |
编辑
当我 create a user from the web site administration tool provided by Asp.NET.时抛出异常:
The following message may help in diagnosing the problem: Exception has been
thrown by the target of an invocation. at
System.RuntimeMethodHandle._InvokeMethodFast(Objec t target, Object[]
arguments, SignatureStruct& sig, MethodAttributes methodAttributes,
RuntimeTypeHandle typeOwner) at
System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[]
arguments, Signature sig, MethodAttributes methodAttributes,
RuntimeTypeHandle typeOwner) at
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags
invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean
skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object
obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo
culture) at
System.Web.Administration.WebAdminMembershipProvid er.CallWebAdminMembershipProviderHelperMethodOutPa rams(String
methodName, Object[] parameters, Type[] paramTypes) at
System.Web.Administration.WebAdminMembershipProvid er.CreateUser(String
username, String password, String email, String passwordQuestion, String
passwordAnswer, Boolean isApproved, Object providerUserKey,
……………………
去google 了一下没有什么结果,不过在一个英文站点发现有人说关于数据库lock的可能性,于是发现自己使用的是一个示例站点,里面已经存在了ASPNETDB,尝试着删除这个数据库并重新建立成员即可。
This is the answer from "mlotfi" :
If you are copying the project from another computer (downloaded), to solve the problem just delete ASPNETDB from App_data, and go to website--> ASP.NET Configuration and add a new user.
posted @
2008-03-05 09:34 work 阅读(40) |
评论 (0) |
编辑
●冒泡排序
using System;
namespace BubbleSorter
{
public class BubbleSorter
{
public void Sort(int [] list)
{
int i,j,temp;
bool done=false;
j=1;
while((j<list.Length)&& (!done))
{
done=true;
for(i=0;i<list.Length-j;i++)
{
if(list>list[i+1])
{
done=false;
temp=list;
list=list[i+1];
list[i+1]=temp;
}
}
j++;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
BubbleSorter sh=new BubbleSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
●选择排序
using System;
namespace SelectionSorter
{
public class SelectionSorter
{
private int min;
public void Sort(int [] list)
{
for(int i=0;i<list.Length-1;i++)
{
min=i;
for(int j=i+1;j<list.Length;j++)
{
if(list[j]<list[min])
min=j;
}
int t=list[min];
list[min]=list;
list=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47};
SelectionSorter ss=new SelectionSorter();
ss.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
●插入排序
using System;
namespace InsertionSorter
{
public class InsertionSorter
{
public void Sort(int [] list)
{
for(int i=1;i<list.Length;i++)
{
int t=list;
int j=i;
while((j>0)&&(list[j-1]>t))
{
list[j]=list[j-1];
--j;
}
list[j]=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47};
InsertionSorter ii=new InsertionSorter();
ii.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0}",iArrary[m]);
Console.WriteLine();
}
}
}
●希尔排序
using System;
namespace ShellSorter
{
public class ShellSorter
{
public void Sort(int [] list)
{
int inc;
for(inc=1;inc<=list.Length/9;inc=3*inc+1);
for(;inc>0;inc/=3)
{
for(int i=inc+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1];
j-=inc;
}
list[j-1]=t;
}
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
ShellSorter sh=new ShellSorter();
sh.Sort(iArrary );
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
posted @
2008-02-22 11:28 work 阅读(63) |
评论 (0) |
编辑
Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。
抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。可以如下示意:
可见,传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。
而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。
其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。
可见,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据;
针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你熟悉Winsock API函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用Socket类开发windows 网络应用程序原来有规可寻,它们在大多数情况下遵循大致相同的步骤。
在使用之前,你需要首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:
public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);
其中,addressFamily 参数指定 Socket 使用的寻址方案,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。
下面的示例语句创建一个 Socket,它可用于在基于 TCP/IP 的网络(如 Internet)上通讯。
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
若要使用 UDP 而不是 TCP,需要更改协议类型,如下面的示例所示:
Socket s = new Socket(AddressFamily.InterNetwork , SocketType.Dgram, ProtocolType.Udp);
一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器,并通过Send/SendTo方法向远程服务器发送数据,而后可以通过Receive/ReceiveFrom从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,记住使用 Shutdown 方法禁用 Socket,并使用 Close 方法关闭 Socket。其间用到的方法/函数有:
Socket.Connect方法:建立到远程设备的连接
public void Connect(EndPoint remoteEP)(有重载方法)
Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。
public int Send(byte[], int, SocketFlags);(有重载方法)
Socket.SendTo 方法 将数据发送到特定终结点。
public int SendTo(byte[], EndPoint);(有重载方法)
Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。
public int Receive(byte[],int,SocketFlags);
Socket.ReceiveFrom方法:接收数据缓冲区中特定位置的数据并存储终结点。
public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint);
Socket.Bind 方法:使 Socket 与一个本地终结点相关联:
public void Bind( EndPoint localEP );
Socket.Listen方法:将 Socket 置于侦听状态。
public void Listen( int backlog );
Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。
public Socket Accept();
Socket.Shutdown方法:禁用某 Socket 上的发送和接收
public void Shutdown( SocketShutdown how );
Socket.Close方法:强制 Socket 连接关闭
public void Close();
可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。
用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,.Net中有两种类可以得到IP地址实例:
IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例:
IPAddress myIP = IPAddress.Parse(" 192.168.1.2");
Dns 类:向使用 TCP/IP Internet 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名(如"host.contoso.com")映射到数字形式的 Internet 地址(如 192.168.1.1)。Resolve方法 返回一个 IPHostEnty 实例,该实例包含所请求名称的地址和别名的列表。大多数情况下,可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例,该实例包含服务器 host.contoso.com 的 IP 地址。
IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList [0];
你也可以使用GetHostName方法得到IPHostEntry实例:
IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com")
在使用以上方法时,你将可能需要处理以下几种异常:
SocketException异常:访问Socket时操作系统发生错误引发
ArgumentNullException异常:参数为空引用引发
ObjectDisposedException异常:Socket已经关闭引发
在掌握上面得知识后,下面的代码将该服务器主机( host.contoso.com的 IP 地址与端口号组合,以便为连接创建远程终结点:
IPEndPoint ipe = new IPEndPoint(ipAddress,11000);
确定了远程设备的地址并选择了用于连接的端口后,应用程序可以尝试建立与远程设备的连接。下面的示例使用现有的 IPEndPoint 实例与远程设备连接,并捕获可能引发的异常:
try {
s.Connect(ipe);//尝试连接
}
//处理参数为空引用异常
catch(ArgumentNullException ae) {
Console.WriteLine("ArgumentNullException : {0}", ae.ToString());
}
//处理操作系统异常
catch(SocketException se) {
Console.WriteLine("SocketException : {0}", se.ToString());
}
catch(Exception e) {
Console.WriteLine("Unexpected exception : {0}", e.ToString());
}
需要知道的是:Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。
另外,很多时候,Socket编程视情况不同需要在客户端和服务器端分别予以实现,在客户端编制应用程序向服务端指定端口发送请求,同时编制服务端应用程序处理该请求,这个过程在上面的阐述中已经提及;当然,并非所有的Socket编程都需要你严格编写这两端程序;视应用情况不同,你可以在客户端构造出请求字符串,服务器相应端口捕获这个请求,交由其公用服务程序进行处理。以下事例语句中的字符串就向远程主机提出页面请求:
string Get = "GET / HTTP/1.1\r\nHost: " + server + "\r\nConnection: Close\r\n\r\n";
远程主机指定端口接受到这一请求后,就可利用其公用服务程序进行处理而不需要另行编制服务器端应用程序。
综合运用以上阐述的使用Visual C#进行Socket网络程序开发的知识,下面的程序段完整地实现了Web页面下载功能。用户只需在窗体上输入远程主机名(Dns 主机名或以点分隔的四部分表示法格式的 IP 地址)和预保存的本地文件名,并利用专门提供Http服务的80端口,就可以获取远程主机页面并保存在本地机指定文件中。如果保存格式是.htm格式,你就可以在Internet浏览器中打开该页面。适当添加代码,你甚至可以实现一个简单的浏览器程序。
实现此功能的主要源代码如下:
//"开始"按钮事件
private void button1_Click(object sender, System.EventArgs e) {
//取得预保存的文件名
string fileName=textBox3.Text.Trim();
//远程主机
string hostName=textBox1.Text.Trim();
//端口
int port=Int32.Parse(textBox2.Text.Trim());
//得到主机信息
IPHostEntry ipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[] ipAddr=ipInfo.AddressList ;
//得到ip
IPAddress ip=ipAddr[0];
//组合出远程终结点
IPEndPoint hostEP=new IPEndPoint(ip,port);
//创建Socket 实例
Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
//尝试连接
socket.Connect(hostEP);
}
catch(Exception se)
{
MessageBox.Show("连接错误"+se.Message,"提示信息
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//发送给远程主机的请求内容串
string sendStr="GET / HTTP/1.1\r\nHost: " + hostName +
"\r\nConnection: Close\r\n\r\n";
//创建bytes字节数组以转换发送串
byte[] bytesSendStr=new byte[1024];
//将发送内容字符串转换成字节byte数组
bytesSendStr= Encoding.ASCII.GetBytes(sendStr);
try
{
//向主机发送请求
socket.Send(bytesSendStr,bytesSendStr.Length,0);
}
catch(Exception ce)
{
MessageBox.Show("发送错误:"+ce.Message,"提示信息
,MessageBoxButtons.RetryCancel ,MessageBoxIcon.Information);
}
//声明接收返回内容的字符串
string recvStr="";
//声明字节数组,一次接收数据的长度为1024字节
byte[] recvBytes=new byte[1024];
//返回实际接收内容的字节数
int bytes=0;
//循环读取,直到接收完所有数据
while(true)
{
bytes=socket.Receive(recvBytes,recvBytes.Length,0);
//读取完成后退出循环
if(bytes<=0)
break;
//将读取的字节数转换为字符串
recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
}
//将所读取的字符串转换为字节数组
byte[] content= Encoding.ASCII.GetBytes(recvStr);
try
{
//创建文件流对象实例
FileStream fs=new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
//写入文件
fs.Write(content,0,content.Length);
}
catch(Exception fe)
{
MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//禁用Socket
socket.Shutdown(SocketShutdown.Both);
//关闭Socket
socket.Close ();
}
}
程序在WindowsXP中文版、.Net Frameworkd 中文正式版、Visual Studio.Net中文正式版下调试通过
posted @
2008-02-22 11:21 work 阅读(153) |
评论 (0) |
编辑
class A
{
A();
f();
};
在vs2005输入A::时,本来应该会有个代码智能提示的,显示class A的所有方法及成员,但是有时候不知道为什么会没有. 这时应该按如下方法解决:
开始->所有程序->Microsoft Visual Stdio 2005->Visual Stdio Tools->Visual Stdio 2005 命令提示
这时会弹出一个命令行对话框, 输入cd..退到上一级目录, 然后 cd Common7\IDE 进入该目录后
再输入devenv.exe /setup /resetuserdata /resetsettings
然后按回车. 在上句中/前面都应该留一个空格.
|
posted @
2008-02-19 09:31 work 阅读(50) |
评论 (0) |
编辑
之所以写这个随笔,我想是因为这个问题整整折磨我了3个小时。。。
上次编写的一个tools要在win form程序里面创建一个线程用来实现功能,but,,,,让我郁闷的一调试就卡死,try……catch的异常也不抛最郁闷。。。后来忽然想起线程同步的问题,开始着手找,终于发现winform 控件为单线程。。。
下面附上前辈一个精华blog,我想如果大家学习winform程序一定要注意这个问题。
转自:http://blog.csdn.net/jxufewbt
今天在编写一个windows应用程序的时候碰到了一个小问题,程序需求是这样的,创建多个线程调用执行某个方法,Windows Form中有个Progress Bar控件用于显示已经执行完毕的进程数,即当所有的线程都运行完毕后,Progress Bar的进度也到头了。先给出初步的实现方式:
private const int MAXTHREAD = 100; //最大线程数
private int n = 0, count = 0; //实际线程数、已结束的线程数
private void StartTest()
{
n = int.Parse(txtThreadCount.Text); //线程数
progressBar1.Maximum = n * 10; //设置ProgressBar的最大值
Thread thread = null;
List<Thread> threads = new List<Thread>(MAXTHREAD);
ReadTableTest t = new ReadTableTest(tableName, fileds);
t.ThreadExitEvent += new ThreadExit(OnThreadExit); //线程执行完毕后通知主界面
try
{
//创建线程
for (int i = 0; i < n; i++)
{
thread = new Thread(new ThreadStart(t.Run));
threads.Add(thread);
}
//开始调用接口
foreach (Thread tt in threads)
{
tt.Start();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//线程执行完毕后回调
public void OnThreadExit()
{
count++;
this.progressBar1.Value = count * 10; //设置ProgressBar的进度
//判断是否全部进程已结束
if (count == n)
{
MessageBox.Show("所有线程已执行完毕!");
ClearState();
}
}
当调试执行这段程序时在this.progressBar1.Value = count * 10;处,报出了InvalidOperationException Cross-thread operation not valid异常,在网上搜索一番后,发现产生该问题的原因如下。
问题原因
由于 Windows 窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用和死锁的情况。于是在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException
解决方案
对于该异常的解决方案有两种,一种是关闭该异常检测的方式来避免异常的出现,经过测试发现此种方法虽然避免了异常的抛出,但是并不能保证程序运行结果的正确性,对于此例来说,经常是全部线程结束时,进度条的显示还未到头呢。下面再来看看更加优雅的解决方案,即通过保证线程的安全性来避免该异常,先来看看两种方案的代码。
方案1
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
说明
关闭CheckForIllegalCrossThreadCalls,这是Control class上的一个static property,默认值为flase,目的在于开关是否对Handle的可能存在的不一致存取的监测;且该项设置是具有Application scope的。
方案2
//未给出代码的部分没有变化
private delegate void SafeSetProgressBarValue(int v);
//线程执行完毕后回调
public void OnThreadExit()
{
count++;
OnSafeSetValue(count * 10); //使用线程安全的代码设置ProgressBar的进度
//判断是否全部进程已结束
if (count == n)
{
MessageBox.Show("所有线程已执行完毕!");
ClearState();
}
}
/// <summary>
/// 线程安全的修改ProgressBarValue方式。
/// </summary>
/// <param name="va"></param>
private void OnSafeSetValue(int va)
{
if (this.progressBar1.InvokeRequired)
{
SafeSetProgressBarValue call = delegate(int v) { this.progressBar1.Value = v; };
this.progressBar1.Invoke(call, va);
}
else
this.progressBar1.Value = va;
}
说明
Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。控件上有四种方法可以安全地从任何线程进行调用:Invoke、BeginInvoke、EndInvoke 和 CreateGraphics。对于所有其他方法调用,当从另一个线程进行调用时,应使用这些 Invoke 方法之一。
Control.InvokeRequired 属性
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。
属性值
如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。
更多资料:
http://msdn2.microsoft.com/zh-cn/library/ms171728(VS.80).aspx
http://msdn2.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired(VS.80).aspx
http://blog.csdn.net/joem/archive/2006/12/18/1448198.aspx
posted @
2008-01-28 15:41 work 阅读(188) |
评论 (1) |
编辑
posted @
2008-01-23 16:26 work 阅读(60) |
评论 (0) |
编辑
posted @
2008-01-23 16:20 work 阅读(31) |
评论 (0) |
编辑
posted @
2008-01-18 17:27 work 阅读(132) |
评论 (0) |
编辑
包括其中第一个CustomAction在“网站设置”页面中的“外观”标题下创建了一个自定义链接.第二个CustomAction在页面的“网站操作”菜单下增加了一个用户自定义菜单项.第三个CustomAction在文档库的“新建”下拉菜单下创建了一个自定义菜单项.第四个CustomAction在文档库的“操作”下拉菜单下创建了一个自定义菜单项。
步骤:
1、创建一个Feature.xml文件
在Features目录下创建一个目录例如MyMenu,在其中创建一个Feature.xml文件,文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<!-- _lcid="1033" _version="12.0.4017" _dal="1" -->
<!-- _LocalBinding -->
<Feature Id="6098EC11-8128-409A-8D2C-414E93F67DD4"
Title="$Resources:GasMenu,MenuTitle;"
Description="$Resources:GasMenu,MenuDescription;"
Version="12.0.0.0"
Scope="Web"
Hidden="FALSE"
DefaultResourceFile="customDocumentLibrary"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="LightUp.xml" />
</ElementManifests>
</Feature>
2、在C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\Resources文件夹中新建GasMenu.zh-CN.resx文件,输入以下内容
<?xml version="1.0" encoding="utf-8"?>
<!-- _lcid="2052" _version="12.0.4518.1016" _dal="1" -->
<!-- _LocalBinding -->
<root>
<Data Name="MenuTitle">
<Value>天然气菜单项</Value>
</Data>
<Data Name="MenuDescription">
<Value>添加了四个菜单项,分别为在“网站设置”页面中的“外观”标题下创建了一个自定义链接、在页面的“网站操作”菜单下增加了一个用户自定义菜单项、在文档库的“新建”下拉菜单下创建了一个自定义菜单项和在文档库的“操作”下拉菜单下创建了一个自定义菜单项。</Value>
</Data>
</root>
3、创建Feature的描述文件LightUp.xml
文档的内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<!-- create command link site setting page -->
<CustomAction Id="SiteSettings" GroupId="Customization"
Location="Microsoft.SharePoint.SiteSettings"
Sequence="106"
Title="Custom Site Setting Command">
<UrlAction Url=""/>
</CustomAction>
<!-- Add command to site action dropdow -->
<CustomAction Id="SiteActionsToolbar"
GroupId="SiteActions"
Location="Microsoft.SharePoint.StandardMenu"
Sequence="1000"
Title="Custom Action"
Description="custom site action"
ImageUrl="/_layouts/images/ACG16.GIF">
<UrlAction Url=""/>
</CustomAction>
<!-- Document Library Toolbar New Menu DropDown -->
<CustomAction Id="DocLibNewToolbar"
RegistrationType="List"
RegistrationId="101"
GroupId="NewMenu"
Rights="ManagePermissions"
Location="Microsoft.SharePoint.StandardMenu"
Sequence="1000"
Title="Custom New Command"
Description="custom new command "
ImageUrl="/_layouts/images/ACG16.GIF">
<UrlAction Url=""/>
</CustomAction>
<!-- Document library Toolbar Actions Menu Dropdown -->
<CustomAction Id="DocLibActionsToolbar"
RegistrationType="List"
RegistrationId="101"
GroupId="ActionsMenu"
Rights="ManagePermissions"
Location="Microsoft.SharePoint.StandardMenu"
Sequence="1000"
Title="Command on Document Library"
Description=" command on document library"
ImageUrl="/_layouts/images/ACG16.GIF">
<UrlAction Url=""/>
</CustomAction>
</Elements>
4、重启IIS(iisreset)
5、在SharePoint服务器上运行CMD.exe,
输入命令切换目录:cd C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN
安装Feature输入命令:stsadm -o installfeature -filename MyMenu
激活Feature输入命令:stsadm -o activatefeature -filename MyMenu\feature.xml -url http://portal:8000/
posted @
2007-11-15 17:17 work 阅读(133) |
评论 (0) |
编辑
摘要: List feature之创建自已的 Document Library FeatureStep 1: Create a directory for the Feature.Create a new directory for your Feature in the C:\Program Files\Common Files\Microsoft Shared\web server extension...
阅读全文
posted @
2007-11-15 17:09 work 阅读(301) |
评论 (0) |
编辑
安装了MOSS2007后,所有与SharePoint相关的文件都放在本地目录C:\Program Files\Common Files\Microsoft Shared\web server extensions\12下面。
下面介绍一些主要的文件目录。
1、 ISAPI目录
此目录下面存放的是SharePoint自带的Web Services,我们也可以自定义Web Services封装在SharePoint里面。自定义Web Services方法见:Writing Custom Web Services for SharePoint Products and Technologies。
2、 Resources目录
SharePoint有两个资源文件夹,目录分别为C:\Program Files\Common Files\MicrosoftShared\web server extensions\12\CONFIG\Resources和C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\Resources,本地化工作主要是编写Resourses里的文件,网站如果显示的一些标题或描述不符合我们的要求,那么可以通过修改资源文件里的
<Data Name="修改元素">
<Value>网站显示的内容</Value>
</Data>
要引用资源文件里面的内容,一般通过$Resources:开头。
例如:<%$Resources:sps,LayoutPageZone_TopZone%>
其中:sps表示资源文件名,与sps.zh-CN.resx相对应。LayoutPageZone_TopZone表示sps.zh-CN.resx文件中的
<Data Name="LayoutPageZone_TopZone">
<Value>顶部区域</Value>
</Data>
节点。
注:一般不推荐修改所有C:\Program Files\Common Files\Microsoft Shared\web server extensions\12目录下的文件,因为这样将给版本升级带来问题。要加入我们自定义的内容通过增加文件到相应的目录下即可。比如这里我们可以增加一个资源文件,把我们要修改的元素放在里面。
3、 TEMPLATE目录
这是一个最主要的目录。子目录介绍如下:
(1)、SiteTemplates目录
放置各种网站定义模板。每个网站定义模板都会有一个ONET.XML文件,它位于 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\SiteTemplates\Site_Definition_Name\XML folder
ONET.XML有五个节:
1、NavBars:指定主页的顶部导航和左部导航
2、ListTemplates:指定该站点可创建的各种列表(自定义列表、文档库、图片库等)
3、DocumentTemplates:指定在创建文档库时可以创建的文档模板(Microsoft Office Word 文档、Microsoft Office FrontPage 网页、Microsoft Office Excel 电子表格等)
4、Configurations:指定站点在创建时默认生成的各种列表和模块
5、Modules:指定站点中默认包含的Web部件库
注意:修改ONET.XML后需要重新启动IIS,才可生效
实例:基于已有模板创建站点模板。
步骤:
1、打开C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates目录
2、复制粘贴一个SPS文件夹,改名为GASSPS
3、找到C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\2052\XML目录
4、在目录中创建一个名为WEBTEMPGASSPS.XML的文件,把下列XML粘贴到文件中
<?xml version="1.0" encoding="utf-8"?>
<!-- _lcid="2052" _version="12.0.4518" _dal="1" -->
<!-- _LocalBinding -->
<Templates xmlns:ows="Microsoft SharePoint">
<Template Name="GASSPS" ID="10001">
<Configuration ID="0" Title=" " Hidden="FALSE" ImageUrl=""
Description=" " >
</Configuration>
</Template>
</Templates>
5、重启IIS(iisreset)
6、打开创建站点页面,在“选择模板”节中多了一个“自定义”选项,下面就有我们刚添加的“浙江天然气模板”。
(2)、THEMES目录
放置各种网站主题。
实例:创建自定义的主题
步骤:
1、先找到 Theme 文件夹位置 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\THEMES
2、复制一个 Theme 的文件夹如 CLASSIC 更改成自己要的名字如 GASTHEME
3、在文件夹中,将CLASSIC.INF 改成与自己文件夹相同的名字如 GASTHEME.INF
4、打开 GASTHEME.INF 将 title 改成与自己文件夹和文件名相同的名字如GASTHEME
5、找到 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\2052\SPTHEMES.XML 文件,复制并粘贴一个<Templates>元素,修改里面的内容如下:
<Templates>
<TemplateID>GASTHEME</TemplateID>
<DisplayName> </DisplayName>
<Description> </Description>
<Thumbnail>images/thwheat.gif</Thumbnail>
<Preview>images/thwheat.gif</Preview>
</Templates>
上面两个图片是参考Wheat主题的图片,也可以改成自己的图片,图片存放位置 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\IMAGES文件夹下
6、打开“网站设置”中“网站主题”,就可以找到我们刚刚添加的GASTHEME主題了。
(3)、LAYOUTS目录
网站所有的页面功能(网址后面有 _layouts的页面)都集中于此目录下面(除了模板中的Default.aspx以及某类型List相关页面)。可以添加自己的功能页面,方法:
(4)、ADMIN目录
管理中心的页面功能集中此目录下面。
(5)、CONTROLTEMPLATES目录
放置各种服务器控件。
(6)、IMAGES目录
放置网站用到的主要图片,如网站Logo等。
(7)、FEATURES目录
放置各种Feature,在MOSS 2007中feature功能之强大超乎想象,可以说对一个已有的网站功能性的增强最后多数都要通过feature来实现。包括母版页、内容页以及文档库等都是通过Feature来实现的。
(来源:http://www.cnblogs.com/lizhimin/)
posted @
2007-11-13 12:52 work 阅读(564) |
评论 (0) |
编辑
Microsoft Office SharePoint Server 2007 (about feature)一系列基本内容(整理摘抄)
前一段研究过一段sharepoint的feature,过程中整理收集了一些资料,将陆续贴出!
posted @
2007-11-13 12:48 work 阅读(273) |
评论 (0) |
编辑