我谈windows函数的返回值规律
2013-08-22 13:49
176 查看
在windows的世界里面,很少有API没有返回值。但是到底返回什么代表成功,这个没有标准。我发现主要有三种模式 1 . 返回非0表示成功,返回0表示失败 大多数Win32 Platform API都是这样,比如 int result =MoveFileEx(szTempName, "allcaps.txt", MOVEFILE_REPLACE_EXISTING); if(!result) { printf("Could not move file. error:%d",GetLastError()); return 0; } 使用这种方法。你必须提供类似GetLastError的取错误的方法,而且你必须保证这个函数是thread-safe的,每个线程能维护自己的错误信息。 2. 返回大于等于0表示成功,返回-1表示失败 socket api大部分是这样设计的 while( bytesRecv != SOCKET_ERROR ) { bytesRecv = recv( ConnectSocket, recvbuf, 32, 0 ); if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) { printf( "Connection Closed.\n"); break; } printf( "Bytes Recv: %ld\n", bytesRecv ); } 这样的好处是返回值就可以用来表示成功和状态。比如这里的recv就可以返回收到的字节数。但是你还是要有一个查询错误的API,like WSAGetLastError(). 3.返回0表示成功 COM的接口大部分是这样设计的 if( FAILED(lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID *) &lpdd))) { //error handle and return } 其他的一些考虑 1.如何定义错误值? 简单的一点使用宏连续定义,like #define E_NO_FILE 1 #define E_BAD_FILE 2 复杂的一点就像COM,严格的定义每一位的意义 这种情况下你可以提供一个宏来创建错误代码,like #define MAKE_HRESULT(sev,fac,code)\ ( (HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) \ | ((unsigned long)(code))) ) 2.可以提供一个宏或者函数来帮助判断是否成功 比如COM提供了FAILED宏来帮助你判断COM的返回值 #define FAILED(Status) ((HRESULT)(Status)<0) 3.如果只有错误和成功两个返回值,考虑使用bool来返回 这个适用于C++,优点是意义很清晰.返回 true就是成功,false就是失败. 4.要使用异常来表示错误的状态么? 使用异常的好处就是返回值被省出来了,可以不返回或者返回其他信息,还有益于定义错误类型和简化程序流程。缺点就是C++对异常支持还不够好,没有finally,每一家编译器支持也不一样,实现可能大不同. |
相关文章推荐
- windows核心编程--函数返回错误
- Windows平台下函数返回错误的处理
- Windows 的GetLastError()函数返回值之含义
- Windows中openProcess函数返回ERROR_ACCESS_DENIED的解决方法
- windows 内核函数命名规律
- windows下socket编程GetLastError()函数返回结果与对照表
- windows下socket编程GetLastError()函数返回结果与对照表-转
- Windows平台下GCC编程之根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。 s=1+1/3+1/5+···+1/(2n-1)
- Windows下 libvlc_new()函数返回为空解决方法
- Dictionary作为数据源绑定,调用c++库中返回为BYTE*的函数,listView项排序
- c语言中如何返回一个数组函数
- MySQL GROUP_CONCAT函数返回BLOB
- oracle 实现 split 函数 (返回数组)
- 函数返回类型为指针类型的一些问题
- 指令 返回一个函数
- windows提取程序权限函数
- C#调用ORACLE存储过程返回结果集及函数
- Windows下WAMP集成软件无法使用mail()函数的解决方案
- 指针与函数_返回指针
- windows下的函数调用栈