VC++初学者常见问题解惑

Visual C++ 专栏收录该内容
45 篇文章 0 订阅

                                   VC++初学者常见问题解惑
    李海 

Visual C++是功能非常强大的工具,但也是公认比较难于入门的。这里,我们整理了一些初学者常见的问题,希望帮助那些刚刚接触Visual C++的朋友享受编程的乐趣。

  问:我是一新手,请问我以前在TC++中写的C++程序,在VC中要建立一个什么样的工程来运行它(程序在TC++是正确的)?

  

  答:在VC++中新建工程时,你可以选择Win 32 Console Application。这种控制台程序像DOS程序一样工作并输出文本信息,虽然不能使用图形函数,但可以使用其它Windows API函数。要注意的是,如果你的TC++程序使用了非ANSI标准的语句,如Conio.h中的函数,可能需要进行一些修改才能在VC++下编译。

  

  问:VC中有没有类拟DoEvents的函数?

  

  答:你可以使用这样的函数:

  BOOL CheckMessageQueue()

  {    MSG msg;

       while(PeekMessage(&&msg, NULL, 0, 0, PM_REMOVE)){

     if(msg.message==WM_QUIT)

         return FALSE;

       TranslateMessage(&&msg);

       DispatchMessage(&&msg);

      }

      return TRUE;

  }

  调用PeekMessage取消息时,其它程序将有机会获得控制权,可以实现DoEvents的效果。但要注意这个函数返回值的含义,如果该函数返回FALSE,说明用户按下了关闭按钮。

  

  问:在不拷贝文件的情况下,如何在C/C++中去掉文件尾部,也就是快速剪短文件?

  

  答:在C/C++中,一般都有一个函数chsize或_chsize可以改变文件的大小。下面是一段例子:

   int fh, result;

   unsigned int nbytes = BUFSIZ;

   /* 打开文件 */

   if( (fh = _open( "c://testdata", _O_RDWR | _O_CREAT, _S_IREAD

         | _S_IWRITE )) != -1 )

   { printf( "修改前文件长度: %ld/n", _filelength( fh ) );

     if( ( result = _chsize( fh, 329678 ) ) == 0 )

  printf( "成功地修改了文件长度/n" );

     else

    printf( "改变文件长度出错/n" );

     printf( "修改后文件长度: %ld/n", _filelength( fh ) );

     _close( fh );}}

  

  问:使用VC5.0将OBJ文件编译成DLL后,用VB调用时总说找不到入口点。请问在什么地方加入关于入口点的参数?

  

  答:找不到入口点有以下几种情况:

  1.没有注意函数名的大小写

    在Win32中,DLL中的函数和VB中的函数必须大小写完全相同,否则系统认为DLL中没有要调用的函数。

  2.没有声明入口函数

    你需要在DLL的.def文件中加上入口函数,如:

   EXPORTS

   SetData @1

   GetData @2

  这样VB程序就可以访问SetData和GetData函数了。其中@1、@2是这两个函数的引用序号,通常在VB中不使用。如果你的DLL工程原本没有使用.def文件,你可以建立一个文本文件,并命名为.def扩展名存盘后加入到工程中。

  3.采用了C++编译方式

    在C++中编译函数时会将函数名进行转换,如将DLL中的kk(double k)转换为_kk@8。解决的办法有两种:

  (1)如果没有使用C++的类,可以将.cpp文件改名为.c,就不进行这种转换了。

  (2)在函数定义前加上extern "c",如:

  extern "c" void _stdcall kk(double k);

    需要指出的是,VC++允许不编写.def文件,而是在函数定义前加__declspec(dllexport)修饰符,这样的函数也可以被外部程序调用。但是这样的函数都将会按C++方式进行函数名转换。虽然这样的函数可以被VB程序调用,但显得不方便,所以仍然建议使用.def文件的办法。

  

  问:使用VC++ 5.0,如何在程序中设置按下Caps Lock 键,使得使用者在某Edit框里输入的字母自动为大写,输入后设置该键再按下,即恢复输入小写字母状态。

  

  答:利用Windows API函数keybd_event可以模拟按下Caps Lock 键。下面的代码能够切换Caps Lock 键。

  void SetCapsLock( BOOL bState )

   {

     BYTE keyState[256];

     GetKeyboardState((LPBYTE)&&keyState);

     if( (bState &&&& !(keyState[VK_CAPITAL] && 1)) ||

       (!bState &&&& (keyState[VK_CAPITAL] && 1)) )

     {

     // 模拟按下一个键

       keybd_event( VK_CAPITAL,

             0x45,

   KEYEVENTF_EXTENDEDKEY | 0,

             0 );

     // 模拟放开一个键

       keybd_event( VK_CAPITAL,

             0x45,

  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,

             0);

     }

   }

  // 当用户切换到Edit1控件,设置为大写状态

  void CDlgDlg::OnSetfocusEdit1()

  {SetCapsLock(TRUE);}

  // 当用户离开Edit1控件,设置为小写状态

  void CDlgDlg::OnKillfocusEdit1()

  { SetCapsLock(FALSE);}

  不过对于你的问题,我建议采用另一种方法,即重载PreTranslateMessage函数,用户每输入一个字母就将其自动转换为大写,而不是修改Caps Lock 键,如:

  BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg)

  { if(pMsg-〉message == WM_CHAR

   &&&& pMsg-〉hwnd == ::GetDlgItem(m_hWnd, IDC_EDIT1))

   { pMsg-〉wParam = toupper(pMsg-〉wParam);}

   return CDialog::PreTranslateMessage(pMsg);

  }

  

  问: 如何编程实现Windows关机的那个对话窗口?就是说,如果我按一个按钮,就可以出现关机对话窗口,让我选择是否关机、重启等等?而且背景也是那样的灰暗。是否有一个现成的API可以调用?

  

  答:有一个未公开的API函数可以实现这个功能,是在Shell32.dll中,但没有名字,索引号为60。这种函数可以使用LoadLibrary和GetProcAddress函数进行调用。

  下面就是一个例子:

  typedef int (CALLBACK *SHUTDOWNDLG) (int);

  void CDlgDlg::OnOK() {

   CString s;

   HINSTANCE hInst = LoadLibrary("shell32");

   SHUTDOWNDLG SHShutDownDialog;

   if(hInst != 0)

   {

   // 获得显示关机对话框函数的地址并调用

   SHShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst, (LPSTR)60);

   (*SHShutDownDialog)(0);

   FreeLibrary(hInst);

   } }

  

  问:在VC中有无方法可以像VFP一样加减日期,从而得出它们之间的时间差值?

  

  答:可以使用CTime类来表示日期,如:

  CTime t1( 1999, 3, 19, 22, 15, 0 ); // 1999年3月19日22:15

  CTime t2( 1999, 3, 20, 22, 15, 0 ); // 1999年3月20日22:15

  CTimeSpan ts = t2 - t1;

  // 对两个日期变量相减,差值保存在CTimeSpan变量中

  ASSERT( ts.GetTotalSeconds() == 86400L );




  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值