`
helpbs
  • 浏览: 1163524 次
文章分类
社区版块
存档分类
最新评论

Visual C++编程疑难问题解

 
阅读更多
原地址:http://www.yesky.com/20030211/1651565_2.shtml
问题一:如何实现指定盘符的光驱弹出弹入

  钥匙在这里:

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 <windows.h><br>#include <iostream><br>#include <string><br>#include <algorithm><br>#include <conio.h><br>using namespace std;</conio.h></algorithm></string></iostream></windows.h>

void j2f(const string &s)
{
 int n=s.length ();
 int r=LCMapString(
   MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),
   LCMAP_TRADITIONAL_CHINESE,
   s.c_str (),s.length (),NULL,0);
 if (!r) cout <<"error :"<<getlasterror>  char *ft=new char[r+1];<br> r=LCMapString(<br>   MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),<br>   LCMAP_TRADITIONAL_CHINESE,<br>   s.c_str (),s.length (),ft,r+1);//这个api搞掂简体转繁体,下面会打印繁体出来<br> if (r) {<br>  ft[r]=0; <br>  cout&lt;<ft>   wchar_t *pws=new wchar_t[r+1];<br>  int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);<br> BOOL f=FALSE;<br> r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&amp;f);//代码页切换搞掂gb-&gt;big5<br> ft[r1]=0;<br> cout&lt;<ft>   for (int i=0;i<r1>    cout&lt;&lt;"";<br>   printf("0x%02x ",(BYTE)ft[i]);<br>  }<br> cout&lt;&lt;")"&lt;<endl>  delete [] pws;<br> }<br><br> delete []ft;<br>}</endl></r1></ft></ft></getlasterror>

//从标准输入简体国标-->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 theApp;

//获得文档模板:
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)
{
 ....
}

<script language="Javascript">document.write("<img src='http://counter.yesky.com/counter.shtml?CID=72348964619288576&AID=-1&refer="+escape(document.referrer)+"&cur="+escape(document.URL)+"' border='0' alt='' width='0' height='0'>");</script>

  问题七:从应用角度讲阻塞与非阻塞SOCKET有什么区别?

  钥匙在这里:

   从系统性能上看,用非阻塞的socket效率和性能更高,但是编程更复杂,特别是当你使用事件或者消息的时候,但是,你可以通过4个工作线程管理100多个socket连接,效率非常高,不需要每个工作线程只管理一个socket连接。 用阻塞的方式比较简单,但当较多客户端时消耗系统资源太多。

   所谓用4个线程管理100多socket,不过是这样一种构思:建立一个线程池,当有socket的事件需要处理时,从线程池中取一个线程来执行,执行完,将线程归还到线程池中。 这样的做法在如下的条件下会工作的更好:

   (1)、每个socket连接的时间较长,不断的与服务器交互。

   (2)、每个连接的socket并不是每时每刻都在收发数据 具体的实现方式:(我是在windows环境下实现的,linux上现在正在研究) 可以使用OVERLAPED IO,或者完成端口(CompeleteIO)

  问题八: 怎样设置栈的大小?

  钥匙在这里:

   方法一:STACKSIZE 定义.def文件

   语法:STACKSIZE reserve[,commit]

      reserve:栈的大小;commit:可选项,与操作系统有关,在NT上只一次分配物理内存的大小

   方法二:设定/STACK

   打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在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:这种方法向目标端口发送一个不包含任何标志的分组。根据RFC793,对于所有关闭的端口,目标系统应该返回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可以指定一个扫描范围,PortPro只能递增扫描,他们都不能一次扫描多个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中看到网络上的所有计算机,以及每台计算机上的用户、组、服务等资源等。

 

分享到:
评论

相关推荐

    Visual C++编程疑难详解(DLL章节节选)

    《Visual C++编程疑难详解》(DLL章节节选)

    Visual C++/Turbo C串口通信编程实践及源代码-3

    Visual C++/Turbo C串口通信编程实践及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信...

    Visual C++_Turbo C 串口通信编程实践.(电子工业.龚建伟.熊光明) 第二版 电子版

    书名:《Visual C++/Turbo C串口通信编程实践》(电子工业出版社.龚建伟.熊光明)。 内容简介 本书从编程实践的角度详细介绍了Windows环境下和DOS环境下的串口通信的基本方法,并根据当前串口与网络结合发展的趋势,...

    Visual C++/Turbo C串口通信编程实践 及源代码-1

    Visual C++/Turbo C串口通信编程实践 及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信...

    visual C++_Turbo C串口通信编程实践

    1.5体验Windows环境下Visual C++串口通信编程 1.6体验DOS环境下Turbo C串口通信编程 第2章 VC多线程串口编程工具CSerialPort类 2.1 类功能及成员函数介绍 2.2 应用CSerialPort类编制基于对话框的应用程序 2.3 ...

    Visual C++/Turbo C串口通信编程实践及源代码-2

    Visual C++/Turbo C串口通信编程实践及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信...

    Visual C++ 数据库系统开发完全手册.part2

    第一篇 Visual C++编程篇 第1章 Visual C++ 6.0开发环境概述 1.1 Visual C++ 6.0概述 1.2 熟悉Visual C++ 6.0的集成开发环境 1.2.1 进入Visual C++ 6.0环境 1.2.2 Visual C++ 6.0的主菜单 1.2.3 Visual C++ 6.0的...

    Visual C++ 数据库系统开发完全手册.part1

    第一篇 Visual C++编程篇 第1章 Visual C++ 6.0开发环境概述 1.1 Visual C++ 6.0概述 1.2 熟悉Visual C++ 6.0的集成开发环境 1.2.1 进入Visual C++ 6.0环境 1.2.2 Visual C++ 6.0的主菜单 1.2.3 Visual C++ 6.0的...

    Visual C++_Turbo C 串口通信编程实践.(电子工业.龚建伟.熊光明) 源码光盘

    书名:《Visual C++/Turbo C串口通信编程实践》(电子工业出版社.龚建伟.熊光明)。 内容简介 本书从编程实践的角度详细介绍了Windows环境下和DOS环境下的串口通信的基本方法,并根据当前串口与网络结合发展的趋势,...

    C与C++程序设计学习与实验系统 2011.2

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C与C++程序设计学习与实验系统

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C_C++集成实验与学习环境

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C_C++程序设计学习与实验系统

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C/C++程序设计学习与实验系统 2010.part2

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C_C++程序设计学习与实验系统 2010 part1

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C/C++程序设计学习与实验系统 2010.part1

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    C/C++程序设计学习与实验系统

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计...

    c++与c程序设计学习与实验系统(2014)

    记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言程序调试大家帮、在线学习交流与问题解答、C语言学习指导、入门程序实例、典型...

Global site tag (gtag.js) - Google Analytics