这篇翻译不完整。请帮忙从英语翻译这篇文章。
草案
本页尚未完工.
The ctypes
object contains methods and predefined data types used to create and manage a library.
方法概览
CType |
CData cast(data, type); |
CType |
CData |
String libraryName(name); |
Library open(libSpec); |
CType |
CType |
CData |
属性
Property | Type | Description |
errno |
Number |
最后一次的系统错误。与库中的errno一样,所有平台都一样,不能被设置。. |
winLastError |
Number|undefined |
最后一次发生的Windows 的错误。与Windows下的 GetLastError类似,只在Window下有效,不能被设置。 |
常量
ABI constants
这些常量是用于调用库的方法时使用。
Constant | Description |
default_abi |
Corresponds to cdecl ; standard libraries use this ABI. You also use this for all system calls on Mac OS X and Linux. |
stdcall_abi |
Used for calling functions declared with stdcall on Windows. These functions' names are automatically mangled for you by js-ctypes. |
winapi_abi |
用于调用Windows 系统函数。与楼上的不同之处在于不能自己指定函数名字. |
预定义的数据类型
原始类型
这些类型在所有平台的表现方式都一样
Type | Description |
int8_t |
Signed 8-bit integer. |
uint8_t |
Unsigned 8-bit integer. |
int16_t |
Signed 16-bit integer. |
uint16_t |
Unsigned 16-bit integer. |
int32_t |
Signed 32-bit integer. |
uint32_t |
Unsigned 32-bit integer. |
int64_t |
Signed 64-bit integer. |
uint64_t |
Unsigned 64-bit integer. |
float32_t |
32-bit floating-point value. |
float64_t |
64-bit floating-point value. |
ctypes.int64
and ctypes.uint64
do not automatically convert to JavaScript numbers. Instead, they convert to objects of the wrapper types ctypes.Int64
and ctypes.UInt64
, which are JavaScript objects rather than CData objects. See 64-bit integers for details.C语言特定类型
These types are designed to work exactly like the corresponding type on the native platform.
Type | Description |
bool |
A Boolean type that behaves like the corresponding C type on the platform. |
short |
A short integer type that behaves like the corresponding C type on the platform. |
unsigned_short |
An unsigned short integer type that behaves like the corresponding C type on the platform. |
int |
An integer type that behaves like the int C type on the platform. |
unsigned_int |
An unsigned integer type that behaves like the unsigned int C type on the platform. |
long |
A long integer type that behaves like the corresponding C type on the platform. NOTE This automatically converts to an |
unsigned_long |
An unsigned long integer type that behaves like the corresponding C type on the platform. NOTE This automatically converts to a |
long_long |
A integer type at least 64 bits wide. |
unsigned_long_long |
An unsigned integer type at least 64 bits wide. |
float |
A floating point value that behaves like the float type on the platform. |
double |
A double-precision floating point value that behaves like the double type on the platform. |
字符类型
Character types are 8-bit values that behave like their C counterparts. They're similar to the int8_t
and uint8_t
types, except conversion is handled differently.
For example, ctypes.char.array(30)(str)
converts the string str
to UTF-8 and returns a new CData
object of array type.
Type | Description |
char |
A character type that behaves like the |
signed_char |
A signed character that behaves like the char type on the platform. |
unsigned_char |
An unsigned character that behaves like the unsigned char type on the platform. |
大小与处理器位数有关的类型
Because it's unknown whether these values will be 32-bit or 64-bit, they are not automatically converted into JavaScript numbers. Instead, these convert into ctypes.Int64
or ctypes.UInt64
JavaScript objects; see 64-bit integers for details.
Type | Description |
size_t |
A platform-dependent size type. |
ssize_t |
A platform-dependent size type. |
intptr_t |
A platform-dependent integer representation of a pointer. |
uintptr_t |
A platform-dependent unsigned integer representation of a pointer. |
JavaScript characters
16-bit C Unicode characters are handled by js-ctypes using the jschar
type.
Type | Description |
jschar |
A 16-bit unsigned character. This is different from uint16_t in that C jschar values are automatically converted into 1-character JavaScript strings. These are Unicode characters. |
Special C types
These types represent C types that have special meanings.
Type | Description |
void_t |
The special C type Note: You must use
void_t , not void , since void is a keyword in JavaScript. |
voidptr_t |
The C type void * . This is a pointer to an indeterminate type of data. |
Large integer types
Because JavaScript doesn't support large (64-bit) integers, js-ctypes provides two data types allowing access to 64-bit integer data.
Type | Description |
Int64 |
A JavaScript object representing a 64-bit signed integer. |
UInt64 |
A JavaScript object representing a 64-bit unsigned integer. |
Methods
cast()
把某个对象转换成新的类型,返回值是拥有这些值的新类型的对象。更多了解可以查看Type casting。
CData cast( data, type );
Parameters
data
- 要转换的数据对象。
type
- 转换后的数据类型,可以是 Predefined data types, 也可以是任何自定义类型。
Return value
拥有相同数据的,不过类型是type的一个新对象。
libraryName()
Returns the correct platform-specific filename for a given library name (e.g. libnss3.dylib
for nss3
on OS X.)
String libraryName( name );
Parameters
name
- The name of the library.
Return value
String containing the platform-specific filename of the library.
open()
Opens a library, specified by a pathname. The library is loaded from the specified full path, or, if a partial path is specified, from the appropriate library directory based on the platform on which the application is running. See Library search paths for more details.
Library open( libSpec );
Parameters
libSpec
- The native library to open, specified as a pathname string.
Return value
A Library
object representing the opened library.
举些栗子
Windows下使用StructType()的例子
好了,上帝说要有按钮TB_BUTTON
,所以我们到MSDN上找TB_BUTTON
的结构体 (MSDN :: TB_BUTTON Structure) ,然后找到了:
typedef struct { int iBitmap; int idCommand; BYTE fsState; BYTE fsStyle; #ifdef _WIN64 BYTE bReserved[6]; #else #if defined(_WIN32) BYTE bReserved[2]; #endif #endif DWORD_PTR dwData; INT_PTR iString; } TBBUTTON, *PTBBUTTON, *LPTBBUTTON;
所以我们现在注意到64位和32位是不同的。所以我们将会指出这个不同之处,然后创造结构体。代码看起来会是这样的:
var struct_TBButton; if (ctypes.voidptr_t.size == 4 /* 32-bit */) { struct_TBButton = ctypes.StructType('TBButton', [ {'iBitmap': ctypes.int}, {'idCommand': ctypes.int}, {'fbState': ctypes.unsigned_char}, {'fsStyle': ctypes.unsigned_char}, {'bReserved': ctypes.unsigned_char}, {'bReserved2': ctypes.unsigned_char}, {'dwData': ctypes.uintptr_t}, {'iString': ctypes.intptr_t} ]); } else if (ctypes.voidptr_t.size == 8 /* 64-bit */) { struct_TBButton = ctypes.StructType('TBButton', [ {'iBitmap': ctypes.int}, {'idCommand': ctypes.int}, {'fbState': ctypes.unsigned_char}, {'fsStyle': ctypes.unsigned_char}, {'bReserved': ctypes.unsigned_char}, {'bReserved2': ctypes.unsigned_char}, {'bReserved3': ctypes.unsigned_char}, {'bReserved4': ctypes.unsigned_char}, {'bReserved5': ctypes.unsigned_char}, {'bReserved6': ctypes.unsigned_char}, {'dwData': ctypes.uintptr_t}, {'iString': ctypes.intptr_t} ]); } else { throw new Error("wut?!"); } console.log(struct_TBButton.size); // 20 on 32-bit, 32 on 64-bit if I'm not mistaken
There is another way to do this, we can use ArrayType
, but example for this I don't know at this time.
Credit for this example is to nmaier (StackOverflow :: Getting TB_BUTTON is crashing and not working)
Example of cast
and FunctionType
on Windows
Components.utils.import("resource://gre/modules/ctypes.jsm"); var kernel = ctypes.open("kernel32.dll"); var HMODULE = ctypes.uint32_t; var HWND = ctypes.uint32_t; var LPCTSTR = ctypes.jschar.ptr; var LPCSTR = ctypes.char.ptr; var LoadLibrary = kernel.declare("LoadLibraryW", ctypes.winapi_abi, HMODULE, LPCTSTR); var GetProcAddress = kernel.declare("GetProcAddress", ctypes.winapi_abi, ctypes.void_t.ptr, HMODULE, LPCSTR); var hUser = LoadLibrary("user32"); var funcPtr = GetProcAddress(hUser, "MessageBoxW"); // Now we have a pointer to a function, let's cast it to the right type var MessageBoxType = ctypes.FunctionType(ctypes.winapi_abi, ctypes.int32_t, [HWND, LPCTSTR, LPCTSTR, ctypes.uint32_t]); funcPtr = ctypes.cast(funcPtr, MessageBoxType.ptr); funcPtr(0, "Test1", "Test2", 0);
Credit for this example is to Wladimir Palant (StackOverflow :: How to call a function using pointer in js-ctypes)