JS - ctypes 를 이용 하여 Thunderbird 확장 개발

4860 단어 jsdlljs-ctypes
최근 썬 더 버드 의 다양한 소프트웨어 버 전에 서 XPCOM 등록 이 성공 하지 못 한 문 제 를 처리 해 왔 다. 한 버 전에 서 개발 한 확장 은 다른 버 전에 서 사용 할 수 없다 는 것 이다.여기 서 오랫동안 고민 하 다가 xulrunner - sdk 버 전이 다 르 기 때문에 XPCOM 구성 요소 개발 이 있 었 습 니 다. 이런 개발 확장 이 너무 번 거 로 웠 습 니 다. 구성 요소 가 완성 하 는 작업 은 중간 모듈 이기 때문에 Thunderbird 와 바 텀 모듈 을 연결 하 는 데 사 용 했 습 니 다. 예전 에 COM 구성 요 소 를 썼 기 때문에 COM 구성 요소 에 대한 개발 경험 에 따라갑자기 XPCOM 구성 요 소 를 사용 할 필요 가 전혀 없다 는 것 을 알 게 되 었 습 니 다. 간단 한 DLL 모듈 만 사용 하면 됩 니 다. Thunderbird 이벤트 에 대한 캡 처, 응답 은 모두 Javascript 으로 이 루어 졌 기 때 문 입 니 다. 저 희 는 JS 로 저희 모듈 을 호출 해 야 합 니 다. 지금 JS 로 dll 을 호출 하 는 방법 을 소개 하 겠 습 니 다: js - ctypes.
MDN 에서 js - ctypes 에 대한 설명:
js-ctypes allows application and extension code to call back and forth to native code written in C. C++ support is limited, see bug 505907 for full support. Unlike binary XPCOM components, It allows developers to ship a single binary for use with multiple versions of Firefox.

주의 두 가지: 1. js - ctypes 는 C libraries 와 만 상호작용 을 하고 C + libraries 와 상호작용 을 할 수 없습니다. C + libraries 와 상호작용 이 필요 하 다 면 중간 C libraries 를 만 들 수 있 습 니 다.
2. 이것 은 중요 한 점 입 니 다. 이것 은 XPCOM 의 버 전 호환성 문 제 를 해결 할 수 있 습 니 다.
js - ctypes 를 사용 하려 면 ctypes. jsm 모듈 을 가 져 와 야 합 니 다:
Components.utils.import("resource://gre/modules/ctypes.jsm")

ctypes 대상 은 방법 과 데이터 형식 을 제공 합 니 다.
CType ArrayType(type[,length]);
Returns a new CType representing an array data type. CData cast(data, type);
Casts the specified CData object to a new type, returning a new CData object representing the value in the new type. CType FunctionType(abi, returnType[, argType1, ...]);
Returns a new CType object describing a C function. CData Int64(n); String libraryName(name);
Returns the correct platform-specific filename for a given library name Library open(libSpec);
Opens a library, specified by a pathname CType PointerType(typeSpec);
Returns a CType object describing a new pointer data type. CType StructType(name[, fields]);
Returns a CType object describing a new structure data type. CData UInt64(n);
ctypes. open 을 사용 하여 로 컬 DLL 을 불 러 옵 니 다. LoadLibrary (), windows 환경 에서:
var lib = ctypes.open("user32.dll");

MAC OS X 에서:
var coreFoundation = ctypes.open("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation");

사용 을 중단 할 때 close () 를 사용 합 니 다. 실패 하면 쓰레기 회수 체 제 는 라 이브 러 리 에 대한 인용 을 자동 으로 닫 습 니 다.
lib.close();

dll 내 보 내기 함 수 는 Library 대상 의 declare () 방법 으로 설명 해 야 합 니 다. 설명 이 되면 함 수 는 표준 문법 으로 함수 호출 을 할 수 있 습 니 다.예 를 들 어 DLL 을 만 들 고 함수 long Add (long a, long b) 를 내 보 냅 니 다.
js - ctypes 에서 우 리 는 그것 에 대해 성명 을 해 야 한다.
var add = lib.declare("Add",
                       ctypes.default_abi,
                       ctypes.long,
                       ctypes.long,
                       ctypes.long);

첫 번 째 매개 변 수 는 함수 명 이 고 두 번 째 매개 변 수 는 세 가지 선택 이 있 습 니 다.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.
뒤의 매개 변 수 는 함수 의 반환 매개 변수 와 입력 매개 변수 입 니 다. 어떻게 되 돌아 가 는 지 void 또는 입력 은 void 입 니 다. 성명 에 표시 하지 않 아 도 됩 니 다.
또한 오류 정 보 를 조회 하 는 두 가지 속성 이 있 습 니 다.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.
메모리 관리: JS 코드 세그먼트 에 구조 체 나 배열 구성원 이 생 성 되면 JS 대상 이 차지 하 는 메모리 가 존재 하면 풀 리 지 않 습 니 다.아래 의 js - ctypes 대상 은 대상 인용 을 가지 고 대상 이 존재 합 니 다.
1. declare () 로 설명 하 는 함수 나 정적 데이터 로 library 대상 이 존재 합 니 다.
2. CType 변 수 는 CType 대상 을 지속 적 으로 존재 합 니 다.
3. 특정한 상황 에서 CData 변 수 는 CData 대상 을 지속 적 으로 존재 하 게 합 니 다.예 를 들 어 방위 구조 체 구성원 이나 배열 구성원 을 통 해 발생 하 는 CData 대상 은 CData 대상 을 지속 적 으로 존재 하 게 할 수 있다.
CData. address () 나 addressOFElement 또는 contents 를 사용 하여 CData 의 내용 을 직접 방문 할 때 CData 대상 이 암시 적 으로 생 성 되 지만 지속 적 으로 존재 하지 않 아 GC 에서 자동 으로 회수 할 수 있 습 니 다.이 를 사용 하기 전에 가리 키 는 대상 이 GC 에서 회수 되 지 않도록 명시 적 으로 인용 해 야 합 니 다.

좋은 웹페이지 즐겨찾기