VC++初学者常见问题解惑 (作者:李海 2000 年 07 月 25 日 12:24) 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 取消息时,其它
程序将有机会获得控制权,可以实现 DoEve nts 的效果。但要注意这个函数返回值的含义,如果该函数返回 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 文件,而是在函数定义前加__decl spec(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 &