2010-07-01 89 views
2

1)如何从PHP调用winapi函数?
2)如何加载任何dll文件并从中调用函数?如何从PHP调用winapi函数?

平台:微软Windows,PHP5

php_w32api扩展名不是avalaible。

也许有解决方案使用COM对象?

+0

为什么php_w32api扩展不可用? – Artefacto 2010-07-01 07:54:53

+0

其实没有太多关于这方面的信息,但是从我得到的信息来看,我认为它在php5中不受支持,而且我找不到工作php_w32api.dll文件 – codez 2010-07-01 08:09:28

+0

请参见[我对类似问题的回答](http:// stackoverflow .COM /问题/ 1411657 /怎么办-I-使-Win32的API的调用,从-PHP/5859879#5859879)。 – 2011-05-02 17:18:33

回答

1

您提到的统计信息。尝试...

 

$wmi_call = "wmic process where \"name like '%php%'\" list statistics"; 
system($wmi_call, $output); 
var_dump($output); 

我的回答对替代赢得API可以是令人沮丧的,但这里有云......

Winbinder,以及提供函数来创建GUI的,它的功能加载和与dll一起工作。您必须查看他们的论坛,以获取最新的裸机,单个dll扩展文件的链接,而不是实现其全部过时的PHP软件包。注意 - 他们的网站最近没有更新过,有一些错误和稳定性问题,功能名称有时与文档不同。

COM()会让你更接近,但还不够远。有关使用PHP/COM的信息,请参见this tuxradar.com article。尽管如此,除了一些典型的COM接口,例如vbscript主机,MS Office应用程序等,PHP无法处理其他许多其他事情。

DOTNET()将使您更进一步。有关该主题,请参阅this peachpit.com article。不完全是我所称的win api,但这将允许您使用“数百”多个.net类和方法。有关.net框架附带的标准类库的文档,请参阅msdn。请注意,PHP的DOTNET搭载COM,除非库的作者在其库中显式启用com功能 - 大多数情况下不能使用它),所以不能使用它。此外,这个DOTNET类似乎非常有限,并不成熟。与VB的导入和使用.net和com库的实际拖放功能相比,PHP实际上已经瘫痪,因此您将花费大量时间来设计草率的变通办法。例如,在PHP中创建交互式窗体时,您不能像预期的那样执行$form_object->Controls->Add($button_object),但可以执行$button_object->Parent = $form_object

我个人尝试过使用COM()和DOTNET()来实现几个com和.net库,只有少数人工作......几乎没有。恕我直言,我建议构建,编译和注册为.net程序集或COM你自己的短的COM启用VB类,你可以从你的PHP脚本使用DOTNET()或COM()钩入。 PHP手册页和上面链接的peachpit.com文章将解释。VB可以动态地导入其他dll,并将它们的类和方法公开给你的PHP脚本。直接从PHP方法中搜索可能比构建这个简短的解决方案需要更长的时间。

0

检查COM extension。你总是可以编写一个PHP扩展,你可以在其中包含你想要的任何本地代码。

2

如果你不能安装扩展,那么我认为唯一的解决方案是编译自己的控制台应用程序,它需要命令行参数,进行调用并输出结果。然后你可以从你的php脚本执行它。效率不高!

编辑:既然你想调用GetCurrentThreadId,这种技术不会太有用!我认为你运气不好,但退房zend_thread_id - 也许返回值实际上是一个Windows线程ID - 你需要检查源确定。也有getmypid,但你几乎肯定会得到一个进程ID,而不是它的线程ID。

+0

我想从kernel32.dll中调用GetCurrentThreadId()。我想这是因为使用WMI我可以获得有关每个进程的每个线程的所有统计信息(cpu使用情况,内存使用情况等)信息。我想确定当前PHP脚本运行的线程。所以运行外部应用程序不会帮助。 – codez 2010-07-01 07:58:34

+0

是的,它调用GetCurrentThreadId。不是应该依赖无证行为... – Artefacto 2010-07-01 08:37:31

+0

php显示zend_thread_id()未定义。从文档 - “他的功能仅在PHP支持ZTS(Zend线程安全)支持时才可用”。这是否意味着我必须自己编译php? – codez 2010-07-01 09:01:48

0

我创建了Windows API基本功能的扩展。

随着php_pthreads变得更好!

http://www.soft-test.com.ar/php_wapi.rar

http://windows.php.net/downloads/pecl/releases/pthreads/

在RAR

我离开Visual Studio 2015和DLL的源代码运行PHP 7.0.2 x64 TS

wapi_screenshot('image.bmp',100,100,50,50); path, left, top, width, height  
wapi_screenshot('image.bmp',0,0,0,0); path, fullscreen  
wapi_get_clipboard(); return clipboard string of windows  
wapi_set_clipboard("hello");  
wapi_mouse_event(MOUSE_LEFTDOWN,0,0,0,0); or LEFTUP, MIDDLEUP, ETC  
wapi_sendkeys("Hello World!{enter}");  
wapi_set_cursor_pos(100,255);  
wapi_get_cursor_pos(); return string "X;Y"  
wapi_get_key_state(VK_A);  
wapi_dialog('open');  
wapi_dialog('save');