博文

[ZT]window系统端口禁止的方法(2007-02-20 12:25:00)

摘要:以前老见网上说为了系统安全建议关闭禁止某些端口,到底如何操作一直不懂,找到一篇说明的挺详细的,转一下。
端口禁止的方法:
首先进入控制面板-管理工具-本地安全策略
第一步,点击“开始”菜单/设置/控制面板/管理工具,双击打开“本地安全策略”,选中“IP 安全策略,在本地计算机”,在右边窗格的空白位置右击鼠标,弹出快捷菜单,选择“创建 IP 安全策略”,于是弹出一个向导。在向导中点击“下一步”按钮,为新的安全策略命名;再按“下一步”,则显示“安全通信请求”画面,在画面上把“激活默认相应规则”左边的钩去掉,点击“完成”按钮就创建了一个新的IP 安全策略。
第二步,右击该IP安全策略,在“属性”对话框中,把“使用添加向导”左边的钩去掉,然后单击“添加”按钮添加新的规则,随后弹出“新规则属性”对话框,在画面上点击“添加”按钮,弹出IP筛选器列表窗口;在列表中,首先把“使用添加向导”左边的钩去掉,然后再点击右边的“添加”按钮添加新的筛选器。
第三步,进入“筛选器属性”对话框,首先看到的是寻址,源地址选“任何 IP 地址”,目标地址选“我的 IP 地址”;点击“协议”选项卡,在“选择协议类型”的下拉列表中选择“UDP”,然后在“到此端口”下的文本框中输入“1434”,点击“确定”按钮,这样就添加了一个屏蔽 TCP 1434(RPC)端口的筛选器,它可以防止外界通过1434端口连上你的电脑。
点击“确定”后回到筛选器列表的对话框,可以看到已经添加了一条策略,建立好上述端口的筛选器,最后点击“确定”按钮。
第四步,在“新规则属性”对话框中,选择“新 IP 筛选器列表”,然后点击其左边的圆圈上加一个点,表示已经激活,最后点击“筛选器操作”选项卡。在“筛选器操作”选项卡中,把“使用添加向导”左边的钩去掉,点击“添加”按钮,添加“阻止”操作:在“新筛选器操作属性”的“安全措施”选项卡中,选择“阻止”,然后点击“确定”按钮。
第五步,进入“新规则属性”对话框,点击“新筛选器操作”,其左边的圆圈会加了一个点,表示已经激活,点击“关闭”按钮,关闭对话框;最后回到“新IP安全策略属性”对话框,在“新的IP筛选器列表”左边打钩,按“确定”按钮关闭对话框。在“本地安全策略”窗口,用鼠标右击新添加的 IP 安全策略,然后选择“指派”。
......

阅读全文(4710) | 评论:1

两台winXP电脑不能互相访问共享文件夹故障的最终解决方法(2007-02-15 10:15:00)

摘要:家中的一台笔记本和一台老的台式机器,都安装了WINXP操作系统,最近把两机器连成为局网,希望互相访问对方的共享文件夹,以实现资源共享。但是经过一番设置后,出现了这样的问题:笔记本可以访问本身的和台式机上的共享文件夹,但是台式机却只能访问自己的,虽然能在网络邻居上看到笔记本的计算机名,但是一点就出现一个要求输入帐号和密码的对话框,而且帐号栏不可修改的显示“notebook/Guest”(notebook为笔记本的计算机名),无论输入什么密码也不能通过。一直弄不懂问题出在哪一台机器上,在网上搜索了很久,才终于找到了答案。公司的电脑也经常出现这样的问题,因此先把它记下来。 如何解除Windows XP系统的文件共享限制
。。。。。。
默认情况下,Windows XP的本地安全设置要求进行网络访问的用户全部采用来宾方式。同时,在Windows XP安全策略的用户权利指派中又禁止Guest用户通过网络访问系统。这样两条相互矛盾的安全策略导致了网内其他用户无法通过网络访问使用Windows XP的计算机。你可采用以下方法解决。[!--empirenews.page--]
方法一:解除对Guest账号的限制
点击“开始→运行”,在“运行”对话框中输入“GPEDIT.MSC”,打开组策略编辑器,依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利指派”,双击“拒绝从网络访问这台计算机”策略,删除里面的“GUEST”账号。这样其他用户就能够用Guest账号通过网络访问使用Windows XP系统的计算机了。
方法二:更改网络访问模式
打开组策略编辑器,依次选择“计算机配置→Windows设置→安全设置→本地策略→安全选项”,双击“网络访问:本地账号的共享和安全模式”策略,将默认设置“仅来宾—本地用户以来宾身份验证”,更改为“经典:本地用户以自己的身份验证”。
现在,当其他用户通过网络访问使用Windows XP的计算机时,就可以用自己的“身份”进行登录了(前提是Windows XP中已有这个账号并且口令是正确的)。
当该策略改变后,文件的共享方式也有所变化,在启用“经典:本地用户以自己的身份验证”方式后,我们可以对同时访问共享文件的用户数量进行限制,并能针对不同用户设置不同的访问权限。<......

阅读全文(7019) | 评论:0

关于使用ifstream读取文件的一个问题及其解决(2007-02-05 10:43:00)

摘要:今天在用vC++编写一个文件操作时发现一个问题,原来程序如下:
//LLK.h class CLLK {
  
public:
 CLLK();
 virtual ~CLLK();
 BOOL LoadMap(const char *path);
} //LLK.cpp #include <fstream>
using namespace std; BOOL CLLK::LoadMap(const char *path)
{
 ifstream fin(path, ios::in);//
 if (!fin)
  return FALSE;
...
 return TRUE;
}
编译时出现以下错误:
--------------------Configuration: Game - Win32 Release--------------------
Compiling...
Game.cpp
GameView.cpp
LLK.cpp
D:\game\LLK.cpp(914) : error C2079: 'fin' uses undefined class 'basic_ifstream<char,struct std::char_traits<char> >'
D:\game\LLK.cpp(914) : error C2078: too many initializers
MainFrm.cpp
MapManager.cpp
Generating Code...
Error executing cl.exe.
Creating browse info file... Game.exe - 2 error(s), 1 warning(s) 在网上查找半天,都说是因为缺少“#include <fstream>”之故,但是我明明已经在LLK.cpp一开头就加上了啊?
后来终于发现,把它转移到LLK.h的开头,问题解决了。奇怪。......

阅读全文(7688) | 评论:0

[ZT]虚函数与多态性、纯虚函数(2007-01-31 10:04:00)

摘要:虚函数与多态性、纯虚函数
1.虚函数与多态性
因为鱼的呼吸是吐泡泡,和一般动物的呼吸不太一样,所以我们在fish类中重新定义breathe方法。程序代码如例2-16所示。
例2-16
#include <iostream.h>
class animal{
public:
 void breathe(){  cout<<"animal breathe"<<endl; }};
class fish:public animal{
public:
 void breathe(){  cout<<"fish bubble"<<endl; }}; void fn(animal *pAn){ pAn->breathe();}
void main(){
 animal *pAn;
 fish fh;
 pAn=&fh;
 fn(pAn);// 输出的结果应该是“animal breathe”
}
为什么输出的结果不是“fish bubble”呢?这是因为在我们将fish类的对象fh的地址赋给pAn时,C++编译器进行了类型转换,此时C++编译器认为变量pAn保存就是animal对象的地址。当在fn函数中执行pAn->breathe()时,调用的当然就是animal对象的breathe函数。
现在我们在animal类的breathe()方法前面加上一个virtual关键字,结果如例2-17所示。
例2-17
#include <iostream.h>
class animal{
public:
//用virtual关键字申明的函数叫做虚函数
virtual void breathe(){  cout<<"animal breathe"<<endl; }};
class fish:public animal{
public:
 void breathe(){  cout<<"fish bub......

阅读全文(3692) | 评论:0

[ZT]VC++指针使用基础(2007-01-05 14:04:00)

摘要:概述
    指针基本上和其它的变量一样,唯一的一点不同就是指针并不包含实际的数据,而是包含了一个指向内存位置的地址,你可以在这个地址找到某些信息。这是一个很重要的概念,并且许多程序或者思想都是将指针作为它们的设计基础,例如链表。     定义一个指针,需要在变量名之前添加一个星号。例如,下面的代码创建了指向整数的指针: int* pNumberOne;     变量名的前缀“p”用来表示这个变量是一个指针。 pNumberOne=&some_number;     “&”标志读作“the address of(……的地址)”,作用是返回一个变量的内存地址,而不是这个变量本身。
    如果希望由pNumberOne而使用some_number的值,可以用*pNumberOne。“*”读作“the memory location pointed to by(由……指向的内存位置)”,它用来取得指针所指向的值。不过指针声明的情况例外,如“int*pNumber”。 见下例: #include
    void main()
    {
    int nNumber;
    int*pPointer;
    nNumber= 15;
    pPointer=&nNumber;
    printf("nNumber is equal to:%d\n", nNumber); //=15
    *pPointer= 25;
    printf("nNumber is equal to:%d\n", nNumber); //=25
    } 内存的动态分配
 &nb......

阅读全文(4733) | 评论:0

[ZT]关于STL中的list,vector,deque队列容器(2007-01-03 11:42:00)

摘要:STL是 C++的ANSI/ISO 标准的一部分,可以用于所有C++语言编译器和所有平台(Windows/Unix/Linux..)。STL的同一版本在任意硬件配置下都是可用的;
STL 提供了大量的可复用软件组织。例如,程序员再也不用自己设计排序,搜索算法了,这些都已经是STL的一部分了。 使用STL编写的代码更容易修改和阅读,因为代码更短了,很多基础工作代码已经被组件化了。 STL 的组成
  STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件。 容器(container):容器是数据在内存中组织的方法,例如,数组、堆栈、队列、链表或二叉树(不过这些都不是STL标准容器)。STL中的容器是一种存储T(Template)类型值的有限集合的数据结构,容器的内部实现一般是类。这些值可以是对象本身,如果数据类型T代表的是Class的话。
算法(algorithm):算法是应用在容器上以各种方法处理其内容的行为或功能。例如,有对容器内容排序、复制、检索和合并的算法。在STL中,算法是由模板函数表现的。这些函数不是容器类的成员函数。相反,它们是独立的函数。令人吃惊的特点之一就是其算法如此通用。不仅可以将其用于STL容器,而且可以用于普通的C++数组或任何其他应用程序指定的容器。
迭代器(iterator):一旦选定一种容器类型和数据行为(算法),那么剩下唯一要他做的就是用迭代器使其相互作用。可以把达代器看作一个指向容器中元素的普通指针。可以如递增一个指针那样递增迭代器,使其依次指向容器中每一个后继的元素。迭代器是STL的一个关键部分,因为它将算法和容器连在一起。 下面我将依次介绍STL的这三个主要组件。 容器
  STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
  在本文中,我将介绍list,vector,deque等队列容器,和set和multisets,map和multimaps等关联容器,一共7......

阅读全文(11682) | 评论:0

vc++常用函数(2006-12-31 17:04:00)

摘要:1)字符转换函数
char *_itoa( int value, char *string, int radix );
char *_i64toa( __int64 value, char *string, int radix );
char * _ui64toa( unsigned _int64 value, char *string, int radix );
wchar_t * _itow( int value, wchar_t *string, int radix );
wchar_t * _i64tow( __int64 value, wchar_t *string, int radix );
wchar_t * _ui64tow( unsigned __int64 value, wchar_t *string, int radix );
double atof( const char *string );
int atoi( const char *string );
__int64 _atoi64( const char *string );
long atol( const char *string );
int sprintf( char *buffer, const char *format [, argument] ... );
int swprintf( wchar_t *buffer, const wchar_t *format [, argument] ... );
void CString::Format( LPCTSTR lpszFormat, ... );
void CString::Format( UINT nFormatID, ... );
其他方法:
可以用CString类的Format()方法,具体实现如下:
int i = 2008;
CString str;
str.Format("%d", i);
这样就OK了。
函数解析:
CString::Format
void Format( LPCTSTR lpszFormat, ... );

阅读全文(5402) | 评论:0

用VC++做一个象模象样的记事本(文本编辑器)续2(2006-12-30 09:51:00)

摘要:用VC++做一个象模象样的记事本(文本编辑器)续2
之前步骤见《用VC++做一个象模象样的记事本(文本编辑器)》及续1
生成的编辑器还没有右键菜单,所以得自己添加,接下来准备为文本编辑器添加右键弹出菜单。
1、由于已经建立了一个类CMyRichEdit,因此为它增加右键响应函数。打开MFC ClassWizard 的MessageMaps,“Class name”选择“CMyRichEdit”,“Object IDs”选择“CMyRichEdit”,“Messages”选择“WM_RBUTTONDOWN”生成“ON_WM_RBUTTONDOWN”函数。
2、为CMyRichEdit::RButtonDown函数添加内容如下:
void CMyRichEdit::OnRButtonDown(UINT nFlags, CPoint point)
{
 //设置为焦点
 SetFocus();
 //创建一个弹出式菜单
 CMenu popmenu;
 popmenu.CreatePopupMenu();
 //添加菜单项目
 popmenu.AppendMenu(0, ID_MENU_EDIT_UNDO, "&Undo");
 popmenu.AppendMenu(0, MF_SEPARATOR);
 popmenu.AppendMenu(0, ID_MENU_EDIT_CUT, "&Cut");
 popmenu.AppendMenu(0, ID_MENU_EDIT_COPY, "C&opy");
 popmenu.AppendMenu(0, ID_MENU_EDIT_PASTE, "&Paste");
 //初始化菜单项
 UINT nUndo=(CanUndo() ? 0 : MF_GRAYED );
 popmenu.EnableMenuItem(ID_MENU_EDIT_UNDO, MF_BYCOMMAND|nUndo);
 UINT nSel=((Get......

阅读全文(5455) | 评论:1

用VC++做一个象模象样的记事本(文本编辑器)续1(2006-12-29 14:27:00)

摘要:用VC++做一个象模象样的记事本(文本编辑器)续1
之前步骤见《用VC++做一个象模象样的记事本(文本编辑器)》 接下来准备为文本编辑器添加编辑菜单。
1、<插入>-<新建类>,添加一个新的类,以便对RICHEDIT控件进行更好的操作。
  类名:CMyRichEdit( BaseClass: CRichEditCtrl ),添加完毕会增加MyRichEdit.h和MyRichEdit.cpp两个新文件。
2、在对话框主文件“TextEditDlg.h”的开头,引入刚刚新添加的类的头文件:“ #include "MyRichEdit.h" ”
3、在CTextEditDlg类的定义中,改变原来RICHEDIT控件的类:
class CTextEditDlg : public CDialog
{......
//CRichEditCtrl m_MyRichEdit; //原来
  CMyRichEdit m_MyRichEdit; //现在
......}
4、为新建的CMyRichEdit类添加一些编辑处理函数(大多数继承CRICHEDITCTRL的处理函数就可以了):
(MyRichEdit.h)
class CMyRichEdit : public CRichEditCtrl
{......
protected:
 //{{AFX_MSG(CMyRichEdit)
 afx_msg void OnRButtonDown(UINT nFlags, CPoint point);//点击右键弹出菜单的函数,不需手工添加
 afx_msg void OnCopy() { Copy(); }
 afx_msg void OnCut() { Cut(); }
 afx_msg void OnPaste() { Paste(); }
 afx_msg void OnUndo() { Undo(); }
......}
5、打开程序的菜单资源,添加以下菜单:
“编辑”(根目录)
“复制”ID_MEMU_EDIT_CO......

阅读全文(6402) | 评论:0

用VC++做一个象模象样的记事本(文本编辑器)(2006-12-25 14:43:00)

摘要:1,新建,工程,MFC AppWizard(exe),(名字定一个,例如:TextEdit)。
2,工程选择采用对话框模式。
3,把对话框上的按钮全部删除,并添加一个RICHEDIT控件。
4,打开TextEdit.cpp文件,在“BOOL CTextEditApp::InitInstance()”函数的第一行添加一行:“::AfxInitRichEdit();”
5,打开MFC ClassWizard 的 MemberVariables,为IDC_RICHEDIT1添加一个控件名“m_MyRichEdit”
6,运行一下,可以看到界面了。
7,点“插入”-“资源”,增加一个菜单资源(IDR_MENU1)。
8,打开菜单资源,添加菜单:
“文件”(根目录)
“新建”ID_MEMU_FILE_NEW
“打开”ID_MEMU_FILE_OPEM
“保存”ID_MEMU_FILE_SAVE
“退出”ID_MEMU_FILE_EXIT
“编辑”(根目录)
    。。。等等
9,将菜单资源装入程序中,做法是在对话框类定义中添加以下代码:
class CTextEditDlg : public CDialog
{......
 CMenu m_menu;
......}
然后在对话框类的初始化函数中添加代码:
BOOL CTextEditDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
......
 //加载菜单
 m_menu.LoadMenu(IDR_MENU1);
 //设置当前菜单
 SetMenu(&m_menu);
 //当你不需要菜单时可以用 SetMenu(NULL);来取消当前菜单
......}
10,运行一下,这时候菜单应出现了。
11,然后在MFC ClassWizard 为每个菜单项目添加响应函数,具体代码如下:
void CTextEditDlg::OnMemuFileOpen()
{......

阅读全文(10379) | 评论:9