CAEngine::SetCallbackObject
ADE User Guide > ADE Server Class Reference > CAEngine
該特徵目前正處於試驗階段。
CAEngine::SetCallbackObject(IUnknown* pCallbackObj)
在ADE計算一個模型或者typescript時,當模型在計算機Analytica中被計算時,將遇到各種要求用戶交互的函數。例如,如果一個表達式包含一個MsgBox函數,Analytica將在一個信息框內顯示一個問題,要求獲取用戶的回答。因為ADE不包含用戶接口,將不會直接處理這些用戶交互。 CAEngine::SetCallbackObject給用戶提供了一種方法在遇到這種事件發生時接收回調,這樣你的程序可以採取預期的動作,例如給用戶顯示一個信息框。
ADE給各種事件(函數或指令)定義各種回調接口,可能觸發用戶接口交互。目前,存在下面的接口:
:注意:此計劃是:一旦這通過實驗階段,將添加其它回調接口,對於一些事件,例如ShowProgressBar、AskMsgNumber、AskMsgText、顯示警告、Show指令(顯示結果、顯示定義、顯示圖形)等等。
用法
要使用回調,你必須執行一個由你想處理和執行其方法的接口所驅動的COM類型。作為一個COM類型,你必須執行標準的IUnknown::QueryInterface COM 方法,這必須報告它支持所有這些接口。然後你再實例化那個類型的例子並將它傳給此方法。
在C++ 中
#使用ADE和 (不间断空格)输入"ADE.exe"; class MyCallback : public IAMsgBoxCallback { public: STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv) { if (riid==IID_IUnknown) { *ppv = (LPVOID)dynamic_cast<IUnknown*>(this); } else if (riid == __uuidof(IAMsgBoxCallback)) { *ppv = (LPVOID)dynamic_cast<IAMsgBoxCallback*>(this); } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return S_OK; } STDMETHOD(ShowMsgBox)(BSTR title, BSTR text, LONG buttons, LONG* /*out*/ whatPressed) { *whatPressed = MessageBox(NULL,text,title,buttons); return S_OK; } }; void main() { CoInitialize(NULL); CAEnginePtr pAde(__uuidof(_CAEngine)); pAde->SetCallbackObject(new MyCallback); ... CoUninitilize(); }
在C#中
目前我們還不能在.NET中這樣做——這是為什麼這現在還是一個考慮中的實驗特徵的原因,我們認為C#執行應該類似於這裡我們所看到的,因為我們目前還沒有讓它能能夠成功運行,明顯我們離這還有相當一段距離。我們的兩個理論就是:該類型上的某些額外的.NET屬性的裝飾仍然是需要的,或者某些額外的註冊表設置需要配置。我們在此提供了這方法用來幫助實驗。
using ADE; namespace MyApp { [Guid("2576608A-833D-4742-BF63-794869E642C3")] // 使用DevStudio中的Create GUID工具建立你自己的 [ClassInterface(ClassInterfaceType.None)] public class MyCallback : IAdeMsgBoxCallback { public int ShowMsgBox(string title, string text, int buttons) { MessageBoxButtons btns = (MessageBoxButtons)buttons; DialogResult res = MessageBox.Show(text, title, btns); return (int)res; } } class Program { static void Main(string[] args) { CAEngine ade = new CAEngine(); ade.SetCallbackObject(new MyCallback()); ... } } }
Comments
Enable comment auto-refresher