2012-11-17 65 views
0

我正在爲現有應用程序構建自動化接口。在實現了一個DLL服務器和一個EXE服務器(主要是爲了熟悉COM的基礎知識)之後,我現在處於從IDL文件生成類型庫的地步,例如,基本上可以使我的應用程序從VBScript自動運行:使用COM自動化應用程序

Set oApp = CreateObject("MyApp.1") 
oApp.ShowAboutBox() 

這個簡單的調用一個不帶參數的函數。下一步我想要調用一個帶參數的函數。

在IDL文件中的函數的簽名是

HRESULT CreateSomeChildWindow([out, retval] MyChildWindow** ppChildWindow); 

,並在VBScript我認爲這將是

Dim oWnd As MyChildWindow 
oWnd = oApp.CreateSomeChildWindow() 

這一呼籲已經在C++雖然MyChildWindow目前尚未註冊工作作爲註冊表中的COM對象。原因MyChildWindow不需要進行註冊是因爲CreateSomeChildWindow只是將接口指針返回到參數中創建的MyChildWindow對象。 不是註冊的原因是我想避免冗餘,並且我也不想MyChildWindow被直接實例化(例如通過在VBScript中調用CreateObject)。

問:

現在,我試圖找出是否有必要註冊畢竟MyChildWindow。是我的假設是正確的,爲了調用CreateSomeChildWindow在VBScript

  • 我需要寫Dim oWnd As MyChildWindow
  • 對於這項工作,MyChildWindow必須註冊

而如果答案是,希望客戶仍然不能直接MyChildWindow,因爲我沒有爲它實現一個類對象?或者我將不得不實現一個類對象?

回答

0

你的out/retval不是一個對象(在腳本端),它是一個接口指針。由於方法CreateSomeChildWindow在IDL上,在類型庫中,在註冊類型庫中 - 因爲整個類型庫已經註冊,所以腳本/自動化知道接口定義,例如方法等。你已經設置好了,不需要額外的註冊。

當調用者接收到一個接口指針時,它不關心指針屬於哪個對象。接口指針本身就夠用了,腳本/自動化環境已知如何處理它。

然而,在被調用方,你需要返回一個接口指針,並且你正在處理對象。所以你需要一些實現這個接口的類,並且你返回這個對象的接口。

+0

聽起來不錯,但調用'oApp.CreateSomeChildWindow()'給我一個錯誤,說參數的數量不正確。我需要什麼語法?如前所述,它從C++調用 - 所有必需的代碼都在服務器端。 – Dabbler

+0

語法看起來不錯(至少看問題中的引用)。我首先要檢查的一個原因是,在更新它之後重新註冊了類型庫,並在其中添加了新的方法。它可能會發生,腳本仍然以某種方式使用舊的語法。 –

+0

嗯,不,IDL文件暫時沒有改變,並且類型庫剛剛被註冊。 – Dabbler