vc问答
  问:我想用VC做一个类似“词霸”的动态提示,当鼠标点上一个词 时,能弹出它的帮助。我知道可以用hook来监控鼠标,以得到它的 位置,但问题是该如何得到该位置处的文本?
  答:这个问题相当复杂。而且词霸的实现也不单使用了hook技术, 这里只能大概说一下我自己的实现方法。我自己编写的程序使用16 位代码,首先接管TextOutEx等重要系统函数(类似在DOS下接管某 中断),然后在自己的处理函数中得到调用窗口句柄、对应文字和 坐标。当鼠标指向某处时,先取得该处窗口句柄,然后和内存中已 经保存的句柄进行比较,把符合要求坐标处的文字取出处理即可。 具体实现可以参考《未公开的Windows核心技术》一书,该书详细 地讲述了这种技术。
  《电子与电脑》99年1期


  问:我的光驱里无盘时,按弹出钮无法弹出。在资源管理器中的右 键菜单中选“弹出”多次只能弹出一次;用自动弹出软件 autojet.exe无论多少次都不能弹出光驱。而光驱里有光盘时,弹 出与关闭都很正常。请问这是怎么回事?另外,我想用Visual C++ 实现光驱的弹出与关闭,应如何实现?
  答:(1) 首先,如果您的光驱买回来就是这个样子,我不知道您的 第一张盘是如何放进去的(买回光驱的时候里面应该没有盘,按照 您的说法,光驱托盘无法弹出,也就没法放盘……)。所以我觉得 这有可能是光驱在使用中出现的故障,应该找出售光驱的厂商维修 或者更换。
  (2) 如果您只是想用VC++来解决您光驱托盘无法弹出的问题, 那么我觉得您最好直接去维修光驱,因为这和您按弹出钮并没有什 么区别。如果您想了解编程实现,下面给出一种实现方法,即利用 MCI命令控制多媒体设备。首先是在您的程序中加入头文件:
  #include
  然后加入下面两个函数:
  void CDEject()
  {
  MCI_SET_PARMS mciset;
  mciSendCommand( wDevID, MCI_SET,
  MCI_SET_DOOR_OPEN | MCI_SET_OFF,
  ( DWORD )( LPSTR ) &mciset );
  }
  
  void CDBack()
  {
  MCI_SET_PARMS mciset;
  mciSendCommand( wDevID, MCI_SET,
  MCI_SET_DOOR_CLOSED | MCI_SET_ON,
  ( DWORD )( LPSTR ) &mciset );
  }
  上面两个函数可以实现光驱托盘的弹出和收回。但是在使用这 两个函数之前,必须得到CD-ROM的设备ID号,这可以通过下面函数 来实现:
  void GetAudioCDDevID()
  {
  MCI_OPEN_PARMS mciOpenParms;
  mciOpenParms.lpstrDeviceType = "cdaudio";
  if( mciSendCommand( 0, MCI_OPEN, MCI_OPEN_TYPE,
  ( DWORD )( LPVOID ) &mciOpenParms ) ) {
  wDevID = 0;
  return;
  }
  wDevID = mciOpenParms.wDeviceID;
  }
  这里,wDevID是CD-ROM的设备ID。在上面的例子里面它应该是 一个全局变量。需要注意的是,在程序运行结束的时候需要关闭该 设备以便其他程序能够接管它,具体实现是:
  BOOL CloseCDDevice()
  {
  DWORD dwRes;
  dwRes = mciSendCommand( wDevID, MCI_CLOSE, 0, 0 );
  return ( !( ( BOOL ) dwRes) );
  }
  在具体实现的时候,一般按照:
  GetAudioCDDevID();
  CDEject(); // 或者CDBack();
  CloseCDDevice();
  的顺序来调用。


  《电子与电脑》99年1期

  问:我在NT上装了IIS3, perl for win32。当我执行一个.pl程序时,浏览器显示出这样的错误:
  "CGI错误
  指定的CGI没有返回完全的HTTP页眉。它返回的页眉是:
  **对不起,名字不能空着。
  Please repost the name section of the guestbook.
  Return to the Guest Book.**"
  **号之间是这个.pl程序应该反馈的正确内容。
  而我在NT的dos窗口下能正确地执行这个.pl程序。反馈的内容是:
  <html><HEAD><TITLE>Missing Name</TITLE></HEAD><BODY>
  <FONT SIZE=5 COLOR=#996633><B>对不起,名字不能空着。</B></FONT>
  <BR><BR>Please repost the name section of the guestbook.<P>
  Return to the <a href="/samples/book.htm">Guest Book</a>.
  </BODY></html>
  看来这是个正确的html文件。是不是IIS没有看到我这个.pl文件的执行结果呢?您能帮我解 释吗?

  答:在你的Perl程序输出之前加上这样一句:
  print "Content-type: text/html\n\n";
  这句话告诉IIS和浏览器,其后的内容是一个HTML文件。如果没有这一句,IIS(也包括一些 浏览器)往往不能正确处理CGI程序的输出内容。当然如果输出的不是一个HTML文件,而是其他类 型的内容,要根据HTTP的定义进行相应的修改。
  


  《电子与电脑》98年12期


  问:最近我听说了一些关于网上虚拟大学的情况,但了解得很少,很少见到详细报道的文章,希 望您能讲解一下。比如,目前有哪些大学开通了此类服务(国内的和国际的大学),他们的网 址、如何收费等详细情况。由于我没有MasterCard之类的卡,如何向国外大学付费?
  答:目前的Internet虚拟大学正如当初电视发明后人们创立电视大学一样,在Internet上开展教 育活动正是利用了这一最新科技,并随着Internet的逐步普及而发展起来的。它们充分利用了WWW 的开放性和传输多媒体信息的特点,建立起拥有某方面专门内容的网点,并模仿大学的有关教学 机制,建立学生档案、设置课程、安排考试。目前国外有许多这方面网点,但由于收费一般采用 信用卡,而我国的银行还没有开办这方面的结算业务,所以目前唯一的方法是通过国外朋友替你 交费。国内这类的网点还不是很多,你可以先到Internet大学(http://www.iu.org.cn)或网际医 学虚拟大学(http://www.stic.gov.tw/stic/d/d19.htm)感受一下虚拟大学的味道。另外,你可以 通过中国教育科研网CERNET (http://www.cernet.edu.cn)关注这方面的信息,据我所知,国内许 多大学正在着手这方面的网点建设。


  《电子与电脑》98年12期


  问:请问如何用IPhone拨打到普通电话上进行通话?
  答:在IPhone5版中提供有由PC向普通电话上呼叫的功能。要实现该功能,需要连接专门的 Internet到公共电话网络的网关,该网关用于将Internet上的数字呼叫转换为电话网的信号,它 由专门的IP服务供应商(ITSP: Internet Telephony Service Provider)提供。在使用PC打普通电 话之前,要在服务提供商处注册并付费。然后通过本地ISP连接到Internet,输入对方的电话号码 (不同国家的国际电话收费不同,但一般远小于国际直拨)、网关服务器上注册的用户名和口 令,便可以建立到普通电话的连接,对方不会知道你是从PC上打过去的。由PC到电话的技术发展 势头强劲,国际上有专门的工业标准H.323v2。目前在中国只有香港有专门为IPhone5提供网关服 务的服务商,网址为http://www.biztrans.com。其他的国内电话网关服务主要针对的是 Net2Phone软件,你可以在http://www.net2phone.com.cn上获得详细的资料,并可以下载 Net2Phone,在国内许多城市都可以完成用户注册。


  《电子与电脑》98年12期


  问:我在使用Turbo Browser98时发现如下问题:在预览窗口中显示Word文件时,只显示字符串; 对于txt文件,则英文的可正常显示、中文全为乱码。请问如何解决?
  答:Turbo Browser是一个功能齐全的文件管理器,具有进行文件格式转换、预览、压缩等功能。 它支持多种文件格式,包括Word文档、电子表格、压缩文件、数据库文件、剪贴画等。Turbo Browser可以直接预览这些文件的内容而不用启动相应的程序,这一功能是靠ActiveX技术来支持 的。你的问题应该是没有安装相应控件而导致的。要在Turbo Browser中预览Office文档,需要安 装Office系统,并在Preview菜单中确认选中Use ActiveX才行。需要注意的是,对于较大的DOC文 件,ActiveX方式会有些慢。至于文本中的中文,则应确保安装有中文系统并选择了正确的内码, 这样预览便不会出错。


  《电子与电脑》98年12期


  问:我在使用VC++ 5.0编程时遇到了这样一个问题:我用AppWizard自动生成了一个视类为CRichEditView的工程,只在菜单中添加了一个命令。该命令的响应函数放在视类中,此函数中调用了GetRichEditCtrl()。ShowWindowText(String);其中String为一中文字符串,但编译运行后发现显示的是一堆乱码,不知该如何解决?

  答:该问题涉及资源码的问题。应该使用字符串资源来进行中文字符操作。即先创立国别为P.R.C.的字符串资源文件,然后使用LoadString函数调用程序,随后可以进行对应显示。