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