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