Windows API编程

来源:互联网 发布:eplan软件 编辑:程序博客网 时间:2024/06/05 11:54

library 指出了程序在链接时需要链接的库文件,用户可以对项目进行设置,也可以使用#pragma comment(lib,"xxx.lib")预编译指令实现对该库文件的链接。

微软还对GDI进行了改进,提供了一个基于类实现的应用编程接口GDI。这个接口主要面向C/C++用户。


1、WindowsAPI 调用的注意事项

前面说WindowsAPI 都是通过动态链接库输出函数实现的,应用程序调用这些函数的时候会按照如下顺序查找动态链接库文件 应用程序所在的当前目录——Windows目录——Windows系统目录——系统环境变量指示的目录,如果这些目录中找不到,程序就会出现运行异常。因此,用户最好把这些动态链接库放在程序所在的目录中调用API函数最简单的方法是采用C和C++编码

如果在执行过程中产生错误,可以调用GetLastError函数来返回错误代码。如果用户需要了解错误代码对应的描述信息,则需要使用VisualC++提供的ErrorLookup工具,输入返回的错误码即可,

        DWORD code = GetLastError();if (code ==0) return;...SetLastError(code);
工具——>Error Lookup可以找到以下对话框



2、程序的调试信息输出

对运行态程序的调试,一种可取方法是采用跟踪日志的方法,把程序运行的中间结果通过字符串格式化输出到一个日志文本文件中。把这些跟踪函数封装到一个公共函数中,在程序需要的时候可以自由调用。如果没有合适的函数,则WritePrivateProfileString是一个不错的选择,这是相对独立的函数,自身就能完成文本内容的输出,输出文件是INI格式,用户检索查找起来比纯文本文件方便。这个函数比使用注册表函数方便的多,它的4个参数全部是字符串,独立调用。而注册表函数需要打开注册表、设置注册键项、关闭注册表,有事还要建立注册键。

WritePrivateProfileString定义如下:

BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName);
详见MSDN。

另外一种记录中间信息的方法就是采用调试语句,最关心的是OutputDebugString 函数,声明如下

void OutputDebugString(LPCTSTR lpOutputString)
在程序运行的时候,可以使用www.sysinternals.com提供的DebugView工具查看调试信息,这是一个免费的绿色工具,只有一个可执行文件,可以放在任何目录下直接运行。举个它跟踪一个Internet Explorer浏览器插件产生的信息,这个信息的生产调用了ATLTRACE宏,不过这个宏肯定最终调用了OutputDebugString 函数。

C和C++用户还可以利用ANSIC或编译器扩展提供预定义宏来丰富调试信息的输出,下面介绍几个常用的宏。

_FILE_当前源文件的文件名,这个宏在编译时候会扩展成字符串,并带有双引号标记

_LINE_当前代码中使用这个宏的行号,这是一个128位无符号长整形整数常量,可以使用#line指令来改变

...

调试函数和预定义宏的使用例子

#include <stdio.h>#include <windows.h>int main(){char szTemp[1024];wsprintf(szTemp, "当前文件名:%s\n",_FILE_);OutputDebugString(szTemp);wsprintf(szTemp, "%d行的内容为 printf(szTemp);\n",_LINE_-1);OutputDebugString(szTemp);wsprintf(szTemp, "编译时间:%s\n",_DATE_""_TIME_);OutputDebugString(szTemp);wsprintf(szTemp, "最后一次文件更新时间:%s\n",_TIMESTAMP_);OutputDebugString(szTemp);return 0;}

以上代码编译说找不到_FILE_等的定义,应该如何定义呢?

注意:预编译宏是在编译时利用编译信息替换了宏定义,当编译成本机代码后,这些信息将被硬编码。其内容不会随运行环境而改变,除非用户重新编译。


原创粉丝点击