【问题标题】:How to call winapi functions from PHP?如何从 PHP 调用 winapi 函数?
【发布时间】:2010-07-01 07:31:54
【问题描述】:

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

平台:ms windows,php5

php_w32api 扩展不可用。

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

【问题讨论】:

  • 为什么php_w32api扩展不可用?
  • 其实这方面的信息不多,但从我得到的信息来看,我认为php5不支持它,我找不到工作的php_w32api.dll文件

标签: php winapi


【解决方案1】:

你提到了统计数据。试试……

$wmi_call = "wmic process where \"name like '%php%'\" list statistics"; 系统($wmi_call,$输出); var_dump($输出);

我对 win api 替代方案的回答可能令人沮丧,但它就是这样......

Winbinder,除了提供创建 GUI 的功能外,它还具有加载和使用 dll 的功能。您必须查看他们的论坛以获得最新的准系统、单个 dll 扩展文件的链接,而不是实现他们的整个过时的 PHP 包。注意 - 他们的网站最近没有更新,存在一些错误和稳定性问题,而且函数名称有时与他们的文档不同。

COM() 会让你更近,但还不够远。请参阅this tuxradar.com article 了解如何使用 PHP/COM。尽管如此,PHP 只能处理一些典型的 com 接口,例如 vbscript 主机、MS office 应用程序等。

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 类,您可以使用 DOTNET() 或 COM() 从 PHP 脚本中挂钩。 PHP 手册页和上面链接的 peachpit.com 文章将进行解释。 VB 可以动态导入其他 dll 并将它们的类和方法公开给您的 PHP 脚本。与构建这个简短的解决方案相比,搜索直接来自 PHP 的方法可能需要更长的时间。

【讨论】:

    【解决方案2】:

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

    编辑:既然你想调用GetCurrentThreadId,这个技术就没有多大用处了!我认为你不走运,但请查看zend_thread_id - 也许它的返回值实际上是一个 Windows 线程 ID - 你需要检查源以确定。还有getmypid,但您几乎可以肯定会从中获得进程ID,而不是线程ID。

    【讨论】:

    • 我想从 kernel32.dll 调用 GetCurrentThreadId()。我想要这个,因为使用 WMI 我可以获得关于每个进程的每个线程的所有统计信息(cpu 使用情况、内存使用情况等)信息。我想识别当前 PHP 脚本运行的线程。所以运行外部应用程序无济于事。
    • 是的,它调用GetCurrentThreadId。并不是说应该依赖无证行为...
    • php 显示 zend_thread_id() 是未定义的。从文档 - “他的功能仅在 PHP 构建时支持 ZTS(Zend 线程安全)支持”。这是否意味着我必须自己编译php?
    • @cod 不,这意味着如果在没有线程支持的情况下编译 PHP,那么询问线程 ID 是没有意义的。 windows.php.net 有 ZTS 和非 ZTS 版本。
    【解决方案3】:

    我为 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 和运行 PHP 7.0.2 x64 TS 的 DLL 中

    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');
    

    【讨论】:

    • 404,还有另一个链接吗?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2010-11-05
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      相关资源
      最近更新 更多