ctypes 编辑
Draft
This page is not complete.
The ctypes
object contains methods and predefined data types used to create and manage a library.
Method overview
CType |
CData cast(data, type); |
CType |
CData |
String libraryName(name); |
Library open(libSpec); |
CType |
CType |
CData |
Properties
Property | Type | Description |
errno | Number | The value of the latest system error. Similar to errno in libc, available on all platforms. Cannot be set. |
winLastError | Number|undefined | The value of the latest Windows error. Similar to GetLastError under Windows, available only for Windows. Cannot be set. |
Constants
ABI constants
These constants are used to specify the ABI
used to call a native function in the library.
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 | Used for calling Windows system functions. These are declared as stdcall on Windows, but do not have mangled names like those used by stdcall_abi above. |
Predefined data types
Primitive types
These types behave the same on all platforms.
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.Types that act like specific C types
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
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. |
Types whose size varies depending on 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 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()
Casts the specified CData
object to a new type, returning a new CData
object representing the value in the new type. See Type casting for details.
CData cast( data, type );
Parameters
data
- The
CData
object to type cast. type
- The type to which to cast the value. This can be one of the Predefined data types, or any user-defined types.
Return value
A new CData
object representing the same data, but with the specified 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.
Examples
Example of StructType() on Windows
Let's say we need TB_BUTTON
, this type needs to be created. So we look up on MSDN what the TB_BUTTON
structures is (MSDN :: TB_BUTTON Structure) and it says it is:
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;
So now notice that if it's 64-bit process it's different than if it's 32-bit process. So we will figure that out and create the structure appropriately. This is what the final looks like:
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)
See also
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论