2010-08-02 00:15:55 +00:00
2010-08-02 00:15:55 +00:00
2004-05-19 08:54:54 +00:00
2009-11-05 16:50:08 +00:00
2004-01-11 05:17:32 +00:00

$Id$

Usage:

First you need to declare the functions and types that you will be using:

$win32_idl <<<EOD
[lib='kernel32.dll'] DWORD GetTickCount();
[lib='user32.dll'] int MessageBoxA(int handle, char *text, char *caption, int type);
EOD;

Then bind those into an ffi context:

$ffi = new ffi($win32_idl);

And then use it:

$count = $ffi->GetTickCount();
echo $ffi->MessageBoxA(0, "The tick count is " . $count, "Ticky Ticky", 1);

Structures:
===========

You can declare structures in your ffi IDL using C style syntax.
Structure support is read-only for the moment.  You can pass structures
to functions and return them (these two examples work on linux):

Passing structs:

<?php

$ffi = new ffi(<<<EOD
struct timeval {
	long tv_sec;
	long tv_usec;
};
struct timezone {
	int  tz_minuteswest;
	int  tz_dsttime;
};
[lib='libc.so.6'] int gettimeofday(struct timeval *tv, struct timezone *tz);
EOD
);

$tv = new ffi_struct($ffi, "timeval");
$tz = new ffi_struct($ffi, "timezone");
var_dump( $ffi->gettimeofday($tv, $tz) );
printf("tv_sec=%d tv_usec=%d\n", $tv->tv_sec, $tv->tv_usec);
?>

Returning Structs:

<?php

$ffi = new ffi(<<<EOD
struct hostent {
  	char *h_name;
    char **h_aliases;
	int h_addrtype;
	int h_length;
	char **h_addr_list;
};
[lib='libc.so.6'] struct hostent *gethostbyname(char *name);
EOD
);

$he = $ffi->gethostbyname("localhost");
printf("h_length=%d h_name=%s\n", $he->h_length, $he->h_name);
?>

Tips:

For functions that expect to copy/store memory into a buffer, use
str_repeat() to "allocate" room for that buffer.

vim:tw=78:et
Description
⚠️ ARCHIVED: Original GitHub repository no longer exists. Preserved as backup on 2026-01-22T16:23:48.307Z
Readme 244 KiB
Languages
C 73.2%
Assembly 24%
Yacc 1.2%
M4 1.2%
PHP 0.2%
Other 0.2%