2012年11月25日 星期日

GetWindowText / VC++ DLL / VC# DLL / COM Object / Apache / PHP

這是這幾天遭遇到的問題
我的應用很簡單,就是用 php 透過網頁獲取主機端的 foobar2000 運行狀況
foobar2000方面已經提供很多資訊(歌名/檔名/時間...等)可以顯示在 Title or status bar


很直覺的想法,把資訊寫在 Title 上後,我再透過 GetWindowText() 這支 windows api 來抓取即可,但是後續實在遭遇到太多問題了,深深讓我覺得在 windows 開發方面我所了解的基礎實在不夠。

相關問題整理在stackoverflow還是求救了 XD

原本想說是 php exec() 有些問題
改用 php 的 COM 來做,因為 COM 要用 dll,我沒有開發 dll 的經驗(慚愧)
馬上找了一些網路資料來看,VC++做了第一個出來,結果竟然 dll 還有分型別,我做出來的不是 COM 型,又很快的用VC#做了第一個 COM 型的出來,並且註冊此 dll。
註冊遇到問題,使用regsvr32一直出現xxx.dll已經載入,但是找不到 DllRegisterServer 進入點
查了後似乎VC++做出來的 dll 是用 regsvr32 註冊VC#做出來的 dll 要用 regasm 註冊,且 regasm 要到 Visual Studio 的工具 / Visual Studio 2008 command prompt 下才可以執行,一般的 command line 不行,註冊過後到 Visual Studio 畫面按 ctrl+alt+j 在編輯自訂元件集裡面的 COM 就可以找到剛剛註冊的 dll。

好 COM 也做了,也用 php 呼叫了,透過瀏覽器依然有問題,所以就去求救。
回覆有個網友提到 allow desktop interaction 這個就是在系統管理工具裡面的服務選個 Apache2.2 登入頁面中的 "允許服務與桌面互動",但是我是無法成功。
另外有個網友說直接用 foobar sdk 去開發應用吧,且已經有現成的幾個套件可以參考了,是啦,我有想過這個,應該是最後一招吧,畢竟我也沒有開發過 foobar 的 plugin 經驗。

這邊有個人問題跟我很像,網友rambo coder回答的重點在於是 apache 是用服務啟動的,改成用手動模式啟動(直接去執行httpd)在win7是可以好的,我用這個方法可以成功,但是我不太想手動模式啟動,還是希望用服務,況且這個似乎是 Session 0 Isolation 的問題,原因是因為 vista 跟 win7後的作業系統基於安全的原因,把 service 改放在 Session 0 中以避免第一位使用者(2000/XP/2003第一位使用者也會在 session 0)登入後跟這些 service 同個 session 導致此使用者有機會透過這些 service 提升自己的權限。但是我是XP應該沒問題吧?

整理整理準備往 foobar sdk 出發 ... Orz 還有力嗎



[reference]
  1. 請問如何製作32位元的DLL
  2. Building COM Objects in C#
  3. C++调用C# COM组件
  4. Capturing the Running IE Instances in C#
  5. Vista 的 Session 0 Isolation 問題
  6. Windows中Session 0隔离对服务程序和驱动程序的影响

沒有留言:

張貼留言

開放匿名留言 請大家注意網路禮儀