2010-07-01 87 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');