Compare Revisions

Using js-ctypes

Change Revisions

Revision 59030:

Revision 59030 by Sheppy on

Revision 59031:

Revision 59031 by Sheppy on

Title:
Using js-ctypes
Using js-ctypes
Slug:
Mozilla/js-ctypes/Using_js-ctypes
Mozilla/js-ctypes/Using_js-ctypes
Tags:
JavaScript, NeedsTechnicalReview, js-ctypes
JavaScript, NeedsTechnicalReview, js-ctypes
Content:

Revision 59030
Revision 59031
tt27    <h2>
28      Example: Calling Windows routines
29    </h2>
30    <p>
31      This example demonstrates how to use ctypes to call a Win32
 > API.
32    </p>
33    <pre class="deki-transform">
34Components.utils.import("resource://gre/modules/ctypes.jsm");
35 
36var lib = ctypes.open("C:\\WINDOWS\\system32\\user32.dll");
37 
38/* Declare the signature of the function we are going to call */
39var msgBox = lib.declare("MessageBoxW",
40                         ctypes.stdcall_abi,
41                         ctypes.int32_t,
42                         ctypes.int32_t,
43                         ctypes.jschar.ptr,
44                         ctypes.jschar.ptr,
45                         ctypes.int32_t);
46var MB_OK = 3;
47 
48var ret = msgBox(0, "Hello world", "title", MB_OK);
49 
50lib.close();
51</pre>
52    <p>
53      In line 3, the <code>user32.dll</code> system library is lo
 >aded. Line 6 declares <code>msgBox()</code> to be a method that c
 >alls the Windows function <a class=" external" href="http://msdn.
 >microsoft.com/en-us/library/ms645505%28VS.85%29.aspx" title="http
 >://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx"><code>M
 >essageBoxW</code></a>. Line 15 calls the <code>msgBox()</code> ro
 >utine, which displays the alert.
54    </p>
55    <p>
56      The last thing we do is call <code>lib.close()</code> to cl
 >ose the library when we're done using it.
57    </p>
58    <p>
59      Instead of defining the whole path, you may also just give 
 >the file name.
60    </p>
61    <pre>
62var lib = ctypes.open("user32.dll");
63</pre>
64    <p>
65      Or even without the extension.
66    </p>
67    <pre>
68var lib = ctypes.open("user32");
69</pre>
70    <p>
71      If the full path is not given, Windows uses the following s
 >earch order to locate the DLL:
72    </p>
73    <ol>
74      <li>The directory from which the application loaded.
75      </li>
76      <li>The system directory.
77      </li>
78      <li>The 16-bit system directory.
79      </li>
80      <li>The Windows directory.
81      </li>
82      <li>The current directory.
83      </li>
84      <li>The directories that are listed in the PATH environment
 > variable.
85      </li>
86    </ol>
87    <p>
88      (taken from <a class=" external" href="http://msdn.microsof
 >t.com/en-us/library/ms682586%28VS.85%29.aspx" title="http://msdn.
 >microsoft.com/en-us/library/ms682586(VS.85).aspx">http://msdn.mic
 >rosoft.com/en-us/library/ms682586(VS.85).aspx</a>)
89    </p>
90    <h2>
91      Example: Calling Carbon routines on Mac OS X
92    </h2>
93    <p>
94      This example demonstrates how to use ctypes to call a Carbo
 >n function on Mac OS X.
95    </p>
96    <pre class="deki-transform">
97/* build a Str255 ("Pascal style") string from the passed-in stri
 >ng */
98 
99function makeStr(str) {
100  return String.fromCharCode(str.length) + str;
101}
102 
103Components.utils.import("resource://gre/modules/ctypes.jsm");
104 
105var carbon = ctypes.open("/System/Library/Frameworks/Carbon.frame
 >work/Carbon");
106 
107stdAlert = carbon.declare("StandardAlert",       /* function name
 > */
108               ctypes.default_abi,    /* ABI type */
109               ctypes.int16_t,        /* return type */
110               ctypes.int16_t,        /* alert type */
111               ctypes.char.ptr,         /* primary text */
112               ctypes.char.ptr,         /* secondary text */
113               ctypes.uint32_t,       /* alert param */
114               ctypes.int16_t);       /* item hit */
115 
116var hit = 0;
117var msgErr = makeStr("Carbon Says...");
118var msgExp = makeStr("We just called the StandardAlert Carbon fun
 >ction from JavaScript!");
119 
120var err = stdAlert(1, msgErr, msgExp, 0, hit);
121 
122carbon.close();
123</pre>
124    <p>
125      The <code>makeStr()</code> function is a utility routine th
 >at takes as input a standard JavaScript string and returns a Carb
 >on-style "Pascal" string, which is a length byte followed by the 
 >characters of the string itself. Note that this only works correc
 >tly if the string is in fact under 256 characters; if it's longer
 >, this will fail spectacularly.
126    </p>
127    <p>
128      In line 9, the Carbon library is loaded from the system's C
 >arbon framework.
129    </p>
130    <p>
131      Line 11 declares the <code>stdAlert()</code> function, whic
 >h will call the Carbon <code>StandardAlert</code> routine. It use
 >s the default ABI, returns a 16-bit integer (which is a Carbon <c
 >ode>OSErr</code> value), and accepts an integer (the alert type),
 > two strings, a pointer to a parameter block, which we aren't usi
 >ng, and another integer, which is used to return the hit item. Se
 >e Apple's documentation for <a class=" external" href="http://dev
 >eloper.apple.com/legacy/mac/library/documentation/Carbon/Referenc
 >e/Dialog_Manager/Reference/reference.html#//apple_ref/c/func/Stan
 >dardAlert" title="http://developer.apple.com/legacy/mac/library/d
 >ocumentation/Carbon/Reference/Dialog_Manager/Reference/reference.
 >html#//apple_ref/c/func/StandardAlert"><code>StandardAlert</code>
 ></a> for details.
132    </p>
133    <p>
134      After that, we simply set up our parameters by using <code>
 >makeStr()</code> to generate the two <code>Str255</code> strings 
 >we need, then call <code>stdAlert()</code>, which produces the fo
 >llowing alert window:
135    </p>
136    <p>
137      <img alt="ctype-mac-dialog.png" class="internal default" sr
 >c="../../../../@api/deki/files/3842/=ctype-mac-dialog.png">
138    </p>
139    <p>
140      The last thing we do is call <code>carbon.close()</code> to
 > close the library when we're done using it.
141    </p>
142    <h2>
143      Example: Calling LibC routines on Linux
144    </h2>
145    <p>
146      This example demonstrates how to use ctypes to call a libc 
 >function on Linux.
147    </p>
148    <pre class="deki-transform">
149/* import js-ctypes */
150Components.utils.import("resource://gre/modules/ctypes.jsm");
151 
152/* open a library */
153var libc = ctypes.open("libc.so.6"); 
154 
155/* import a function */
156var puts = libc.declare("puts", /* function name */
157                           ctypes.default_abi, /* call ABI */
158                           ctypes.int32_t, /* return type */
159                           ctypes.char.ptr /* argument type */
160);
161var ret = puts("Hello World from js-ctypes!");
162</pre>

Back to History