各种api 的坑

来源:互联网 发布:富士通热敏打印软件 编辑:程序博客网 时间:2024/06/09 15:26
最近在做新的项目,设计打文件传输问题,lua和c++交互。踩了不少坑,也收获很多。
1.luaL_tointeger 和lua_tonumber
在把大文件的大小传给c++时,用lua_tointeger取出,导致计算出错。后来经过仔细看了lua api文档,才发现,这个接口转出的结果是整形,长度明显不够。最终只能用lua_tonumber解决问题。
lua_tointeger
lua_Integer lua_tointeger (lua_State *L, int idx);
把给定索引处的 Lua 值转换为 lua_Integer 这样一个有符号整数类型。 这个 Lua 值必须是一个数字或是一个可以转换为数字的字符串 否则,lua_tointeger 返回 0 。
如果数字不是一个整数, 截断小数部分的方式没有被明确定义。

lua_tonumber
lua_Number lua_tonumber (lua_State *L, int index);
把给定索引处的 Lua 值转换为 lua_Number 这样一个 C 类型
lua_Number
typedef double lua_Number;
Lua 中数字的类型。 确省是 double ,但是你可以在 luaconf.h 中修改它。
通过修改配置文件你可以改变 Lua 让它操作其它数字类型

2.fseek和 _fseeki64
在上传文件时是分块上传,读取文件时就用到了fseek移动文件指针的偏移,诡异的出错了,每次读取超过2G的文件,fseek都失败。long的最大值是2147483647
int fseek( FILE *stream, long offset, int origin ); 
int _fseeki64( FILE *stream, __int64 offset, int origin );

3.GetFileSize 和GetFileSizeEx
第三个坑还是跟文件大小有关,不熟悉win api,凭经验,直接用了GetFileSize ,超过2G的文件返回值又错了。
typedefunion _LARGE_INTEGER {
struct { DWORD LowPart; LONG  HighPart; }; 
struct { DWORD LowPart; LONG  HighPart; } u; 
LONGLONG QuadPart;} LARGE_INTEGER, *PLARGE_INTEGER;

BOOL WINAPI GetFileSizeEx( _In_  HANDLE         hFile, _Out_ PLARGE_INTEGER lpFileSize);
DWORD WINAPI GetFileSize( _In_      HANDLE  hFile, _Out_opt_ LPDWORD lpFileSizeHigh);








原创粉丝点击