«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1406018
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]Visual C++编程疑难问题解
既瑜(224499) 发表于 2005/3/18 19:58:22

    [前言:]编程中遇到的问题很多,再优秀的程序员也不会没有问题,但很多解决方 法被淹没在论坛浩瀚的“水”中了,为了便于同道查询同时保存这些精华,我将在实际编 程中常见的问题以及论坛中优秀的回贴收集起来以专题的形式发表。本文中的所有问题及 回答均来自论坛。   问题一:如何实现指定盘符的光驱弹出弹入   钥匙在这里: void ctrl_cdrom_door( LPCTSTR drivename ,//驱动器的名字如f:等. bool fOpen file://弹出时用true,弹入时用false ) {  TCHAR devstr[128],ctrlstr[128];  wsprintf(devstr,_T("open %s type cdaudio alias mycd wait"),drivename);  wsprintf(ctrlstr,_T("set mycd door %s wait"),fOpen?_T("open"):_T("closed"));  mciSendString(devstr,NULL,0,NULL);  mciSendString(ctrlstr,NULL,0,NULL);  mciSendString(_T("close mycd wait"),NULL,0,NULL); } file://测试的例子代码. void CMainFrame::OnTestOpen() {  // TODO: Add your command handler code here  ctrl_cdrom_door("F:",true); } void CMainFrame::OnTestClose() {  // TODO: Add your command handler code here  ctrl_cdrom_door("F:",false); }   问题二:如何实现繁简体互换?   钥匙在这里: // j2f.cpp : 简体(gb)==>繁体==>big5的过程 // 反向转换是类似的. // 注意直接从简体-->big5不能做到一一对应.会有很多?出现, // 故此需要先转成繁体.再转成big5. // 我感觉这种方法应当和winnt或office里提供的繁简或字符集互转是一致的. #include "stdafx.h" #include #include #include #include #include using namespace std; void j2f(const string &s) {  int n=s.length ();  int r=LCMapString(    MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINES E_PRC),    LCMAP_TRADITIONAL_CHINESE,    s.c_str (),s.length (),NULL,0);  if (!r) cout <<"error :"<  char *ft=new char[r+1];  r=LCMapString(    MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINES E_PRC),    LCMAP_TRADITIONAL_CHINESE,    s.c_str (),s.length (),ft,r+1);//这个api搞掂简体转繁体,下面会打印繁体出来  if (r) {   ft[r]=0;   cout<   wchar_t *pws=new wchar_t[r+1];   int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);  BOOL f=FALSE;  r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5  ft[r1]=0;  cout<   for (int i=0;i    cout<<"";    printf("0x%02x ",(BYTE)ft[i]);   }  cout<<")"<  delete [] pws;  }  delete []ft; } //从标准输入简体国标-->big5繁体标准输出,输入两个空行退出 int main(int argc, char* argv[]) {  for(;;){   char line[1024];   cin.getline (line,sizeof(line));  string s(line);  if (!cin ||s.length ()==0) break;  j2f(s); } _getch(); return 0; }   问题三:多线程中如何得到视图指针?   钥匙在这里:有两种方法可以实现你的要求:   1)第一种方法:   要是多线程不是在App.cpp里出现,那么要在多线程的.cpp中加上extern CYourApp th eApp; //获得文档模板: POSITION curTemplatePos = theApp.GetFirstDocTemplatePosition(); CDocTemplate *m_doc=theApp.GetNextDocTemplate(curTemplatePos); file://获得文档: curTemplatePos=m_doc->GetFirstDocPosition(); CYourDoc *m_pdoc=(CA8Doc*)m_doc->GetNextDoc(curTemplatePos); file://获得视图: curTemplatePos=m_pdoc->GetFirstViewPosition(); CYourView *m_pview=(CYourView*)m_pdoc->GetNextView(curTemplatePos); file://调用视图函数: m_pview->Put();   2)第二种方法: //获得窗体指针: CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; file://获得与该窗体符合的视图: CYourView *m_pView = (CYourView *) pFrame->GetActiveView(); file://调用视图函数: m_pView->Put();   问题四:如何使程序在启动时不创建一个新文档?   钥匙在这里: 在程序的InitInstance中的ProcessShellCommand函数之前加入:     cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing   问题五:如何在MDI程序中得到所有的视图?   钥匙在这里:    必须用一些文档中没有记载的函数: CDocument::GetFirstViewPosition(); // DOCCORE.CPP CDocument::GetNextView(); // DOCCORE.CPP CMultiDocTemplate::GetFirstDocPosition(); // DOCMULTI.CPP CMultiDocTemplate::GetNextDoc(); // DOCMULTI.CPP     同时还需要与CWinApp的成员m_templateList打交道。   问题六: ADO中如何得到某个数据库中的所有表的数目?   钥匙在这里: HRESULT hr = S_OK; _ConnectionPtr pConnection = NULL; _CatalogPtr pCatalog = NULL; _bstr_t strCnn("Provider=sqloledb;Data Source=MyServer;" "Initial Catalog=pubs;User Id=sa;Password=;"); try {  file://Define a command object for a stored procedure.  pConnection.CreateInstance(__uuidof(Connection));  hr = pCatalog.CreateInstance(__uuidof (Catalog));  hr = pConnection->Open(strCnn,"","",adConnectUnspecified);  pCatalog->PutActiveConnection(_variant_t((IDispatch *) pConnection));  long nTBCount = pCatalog->Tables->Count;//这就是你想要的表的数目  pConnection->Close();  pConnection = NULL; } catch(_com_error &e) {  .... }   问题七:从应用角度讲阻塞与非阻塞SOCKET有什么区别?   钥匙在这里:    从系统性能上看,用非阻塞的socket效率和性能更高,但是编程更复杂,特别是当 你使用事件或者消息的时候,但是,你可以通过4个工作线程管理100多个socket连接,效 率非常高,不需要每个工作线程只管理一个socket连接。 用阻塞的方式比较简单,但当较 多客户端时消耗系统资源太多。    所谓用4个线程管理100多socket,不过是这样一种构思:建立一个线程池,当有so cket的事件需要处理时,从线程池中取一个线程来执行,执行完,将线程归还到线程池中 。 这样的做法在如下的条件下会工作的更好:    (1)、每个socket连接的时间较长,不断的与服务器交互。    (2)、每个连接的socket并不是每时每刻都在收发数据 具体的实现方式:(我是 在windows环境下实现的,linux上现在正在研究) 可以使用OVERLAPED IO,或者完成端口 (CompeleteIO)   问题八: 怎样设置栈的大小?   钥匙在这里:    方法一:STACKSIZE 定义.def文件    语法:STACKSIZE reserve[,commit]       reserve:栈的大小;commit:可选项,与操作系统有关,在NT上只一次分配 物理内存的大小    方法二:设定/STACK    打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Out put,然后在Reserve中设定堆栈的最大值和commit。    注意:reserve默认值为1MB,最小值为4Byte;commit是保留在虚拟内存的页文件里 面,它设置的较 大会使栈开辟较大的值,可能增加内存的开销和启动时间    问题九:如何获取本机上正在使用的UDP端口?    钥匙在这里:     可以通过端口扫描技术实现。     端口扫描技术(port scanning)      端口扫描就是通过连接到目标系统的TCP或UDP端口,来确定什么服务正在运行。一般 来说端口扫描有三个用途:    * 识别目标系统上正在运行的TCP和UDP服务。    * 识别目标系统的操作系统类型(Windows 9x, Windows NT,或UNIX,等)。    * 识别某个应用程序或某个特定服务的版本号。        端口扫描技术:    1. TCP connect scan:这种方法最简单,直接连到目标端口并完成一个完整的三次 握手过程(SYN, SYN/ACK, 和ACK)。缺点是容易被目标系统检测到。    2. TCP SYN scan:这种技术也叫“半开式扫描”(half-open scanning),因为它 没有完成一个完整的TCP连接。这种方法向目标端口发送一个SYN分组(packet),如果目 标端口返回SYN/ACK,那么可以肯定该端口处于检听状态;否则,返回的是RST/ACK。这种 方法比第一种更具隐蔽性,可能不会在目标系统中留下扫描痕迹。    3. TCP FIN scan:这种方法向目标端口发送一个FIN分组。按RFC793的规定(http: //www.ietf.org/rfc/rfc0793.txt),对于所有关闭的端口,目标系统应该返回RST标志。 这种方法通常用在基于UNIX的TCP/IP堆栈。    4. TCP Xmas Tree scan:这种方法向目标端口发送一个含有FIN, URG,和PUSH标志的 分组。根据RFC793,对于所有关闭的端口,目标系统应该返回RST标志。    5. TCP Null scan:这种方法向目标端口发送一个不包含任何标志的分组。根据RFC 793,对于所有关闭的端口,目标系统应该返回RST标志。    6. UDP scan:这种方法向目标端口发送一个UDP分组。如果目标端口以“ICMP port unreachable”消息响应,那么说明该端口是关闭的;反之,如果没有收到“ICMP port unreachable”响应消息,则可以肯定该端口是打开的。由于UDP协议是面向无连接的协议 ,这种扫描技术的精确性高度依赖于网络性能和系统资源。另外,如果目标系统采用了大 量分组过滤技术,那么UDP扫描过程会变得非常慢。如果你想对Internet进行UDP扫描,那 么你不能指望得到可靠的结果。      另外,有某种系统的IP协议是这样实现的,对于所有扫描的端口,不管他们处于关闭 或者监听状态,都返回RST标志(我们知道,这不符合RFC793的规定)。因此,扫描这种系 统时,用不同的扫描技术可能得到不同的扫描结果。       端口扫描工具:       * Strobe    Strobe是一个很古老的端口扫描工具,最快且最可靠的TCP扫描工具之一。缺点在于 没有UDP扫描功能。    URL: ftp.win.or.jp/pub/network/misc/strobe-1.05.tar.gz       * Udp_scan    Udp_scan最初来自SATAN(Security Administrator Tool for Analyzing Networks, 安全管理员的网络分析工具,SATAN的新版本改称SAINT,由http://wwdsilx.wwdsi.com发 布)。Udp_scan是最可靠的UDP扫描工具之一,但隐蔽性不好,容易被目标系统检测到。    URL: ftp://ftp.technotronic.com/unix/network-sanners/udpscan.c       * Netcat    Netcat是最有用的网络工具之一,功能很多,有网络安全工具包中的瑞士军刀之称。 Netcat提供基本的TCP、UDP扫描功能。    URL: http://www.l0pht.com/netcat       * PortPro and Portscan   是Windows NT上最快的端口扫描工具之一。Portscan可以指定一个扫描范围,PortPr o只能递增扫描,他们都不能一次扫描多个ip地址。    URL: PortPro: http://www.securityfocus.com       * Network Mapper(nmap)    Nmap是一个高级端口扫描工具,提供了多种扫描方法。Nmap有一些有趣的功能,如用 分解(fragment)TCP头(就是把一个TCP头分解到多个分组中发送)的方法绕过一些具有 简单分组过滤功能的防火墙。Nmap的另一个有趣功能是可以发送欺骗地址扫描。具体的实 现方法是:以伪造的IP地址向目标系统发送大量SYN分组,并在其中混以真实地址的SYN分 组,这会导致目标系统花大量时间去响应那些伪造分组,从而造成拒绝服务(denial of service),这就是所谓的SYN flood攻击。    URL: http://www.insecure.org/nmap   问题十:如何利用DirectoryEntry组件来查看网络     钥匙在这里:    DirectoryEntry组件提供了Path属性,根据文档,此属性指定了目录服务中用来访 问对象的对象名,其格式如下:    protocol://servername:port number/distinguished name    此语句的第一部分定义了访问将使用的协议,如    LDAP: (Lightweight Directory Access Protocol)    IIS: (提供IIS元数据来读及配置Internet Infomation Server)    WinNT: (提供在非常有限的性能下对Windows NT域的访问)    NDS: (提供对Novell Directory Service的访问)    等等(详细信息清参考MSDN)。    据此,我们构造了一个DirectoryEntry实例,将它的Path设为"WinNT:",以通过对 它的所有子项的枚举来发现网络上的所有域(以及工作组)。这样,再对所发现的域(以 及工作组)的子项进行枚举,就可以发现网络上的所有计算机。下面的一个控制台小程序 演示了这一点。 using System; using System.DirectoryServices; class TempClass {  static void Main()  {   EnumComputers();  }  static void EnumComputers()  {   using(DirectoryEntry root = new DirectoryEntry("WinNT:"))   {    foreach(DirectoryEntry domain in root.Children)    {     Console.WriteLine("Domain | WorkGroup:\t"+domain.Name);     foreach(DirectoryEntry computer in domain.Children)     {      Console.WriteLine("Computer:\t"+computer.Name);     }    }   }  } }   上面代码中两个嵌套的foreach循环看起来并不是太好,并且控制台的显示效果也并不 那么美观。下面,我将对代码进行一些改动,并将它移植到WinForm上。   新建一个Windows Application[C#],在Form上添加一个TreeView,命名为treeView1。   添加以下几个函数: //用指定的文本构造一个节点,将其添加为参数parant的子节点,并返回刚构造的节点 private TreeNode AddNode(TreeNode parant,string text) {  TreeNode node = new TreeNode(text);  parant.Nodes.Add(node);  return node; } //递归地找到参数entry的所有子节点,并在treeView1中显示;这里的entry与entryNode 需相对应 private void EnumChildren(DirectoryEntry entry,TreeNode entryNode) {  if(entry.Children!=null) file://如果无子节点则结束  {   foreach(DirectoryEntry i in entry.Children)   {    file://将各子节点加入TreeView,并进行递归    EnumChildren(i,AddNode(entryNode,i.Name));   }  } } //用给定的字符串构造根节点,并列出其所有子节点 private void Enumerate(string path) {  try  {   using(DirectoryEntry root = new DirectoryEntry(path))   {    TreeNode node = new TreeNode(root.Name);    treeView1.Nodes.Add(node);    EnumChildren(root,node);   }  }  catch {} }    这样,通过传递 "WinNT:" 给函数Enumerate(string),就可以在TreeView中看到网 络上的所有计算机,以及每台计算机上的用户、组、服务等资源等。

阅读全文(1402) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144764171 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号