Без заголовка

Так случилось, что в PHP существует три модуля расширения - два для PHP4 и один для PHP5, позволяющих обращаться к Windows API. Способы их вызова различны, плюс ко всему, положение усугубляется тем, что модули расширения имеют одинаковые имена, документация есть только по первому из них, тогда как в комплект PHP включается второй.

Ниже - результат моей потребности выяснить как же это всё работает. Прежде всего стоит заметить, что w32api не работает с mod_php, если старая версия вызывает ошибку при попытке повторного вызова в то же child, то новая вызывает ошибку сразу. В режиме CGI и с PHP5 я таких экспериментов не проводил.

Итак, ниже - реализация функции link (hard link) для Windows NT. Под CLI пример работает как с PHP5, так и с PHP4. Конечно, для того, чтобы пример заработал, нужна файловая система, поддерживающая hard links. Под моей NTFS5 (Windows XP) ссылки ставятся.
	// Written by Evgeny Stepanischev (aka BOLK)

	if (PHP_OS == 'WINNT')
	{
		// Модуль расширения FFI для PHP5
    	if (extension_loaded('ffi') || intval(PHP_VERSION) >= 5 && @dl('php_ffi.dll'))
    	{
    		function link($target, $link)
    		{
    			$api =& new ffi("[lib='kernel32.dll'] int ".
    			"CreateHardLinkA( char *link, char *target, long *attr);");
    			return (bool) $api->CreateHardLinkA($link, $target, NULL);
    		}
    	}
    	else
    	// Модуль расширения w32API для PHP4
    	if (extension_loaded('w32api') || @dl('php_w32api.dll'))
    	{
    		// Старая версия модуля
    		if (function_exists('w32api_register_function'))
    		{
				if (!function_exists('CreateHardLinkA'))
    			@w32api_register_function('kernel32.dll', 'CreateHardLinkA', 'bool');

    			if (function_exists('CreateHardLinkA'))
    			{
    				function link($target, $link)
    				{
    					return CreateHardLinkA($link, $target, NULL);
    				}
    			}
    		} else
    		{
    			// Новая (примерно с версии PHP 4.3.0)
    			function link($target, $link)
    			{
    				$api =& new win32;
    				$api->registerfunction("bool CreateHardLinkA".
    				"(string &link, string &target) From kernel32.dll");

    				return $api->CreateHardLinkA($link, $target);
    			}
    		}
    	}
	}
24 августа 2004 20:00

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML: